二维char数组与二维char指针

本文探讨二维字符数组和二维字符指针的区别,分析了使用char**作为二维字符串数组参数导致的段错误原因,并展示了sizeof在两者中的不同应用。此外,还通过示例解释了二维数组和二维指针的赋值问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

char**的内存结构可以看成有多个连续的char*类型的元素构成,而二维字符数组是由M*N个字符组成。


1. 以下函数将出现段错误:
#include <stdio.h>
#define M 2
#define N 100


void test(const char** pstr)
{
int i = 0;
for(i = 0; i < 2; i++)
{
printf("array[%d]= %s/n",  i,*(pstr+i));
}
return;
}


int main()
{
char char_array[M][N] = {"a.txt", "b.txt"};

test((const char**) char_array);


return 0;
}


原因:
用char**传递二维字符串数组的首地址时。相同的地址空间,但由于元素类型不一样,取出的值也不一样。
使用*pstr时,实际上取出的是前4个字符组成的int值,不是期望中的char_array[0]的起始地址。所以出现段错误也就很好理解了。


2. 二维数组和二维指针的sizeof用法
char char_array[3][10] = {"a.txt", "b.txt"};
printf("char_array's sizeof = %d\n", sizeof(char_array));
printf("*char_array's sizeof = %d\n", sizeof(*char_array));
printf("**char_array's sizeof = %d\n", sizeof(**char_array));


char **char_array2 = {"a.txt", "b.txt"};
printf("char_array2's sizeof = %d\n", sizeof(char_array2));
printf("*char_array2's sizeof = %d\n", sizeof(*char_array2));
printf("**char_array2's sizeof = %d\n", sizeof(**char_array2));


打印结果为:
char_array's sizeof = 30
*char_array's sizeof = 10
**char_array's sizeof = 1
char_array2's sizeof = 4
*char_array2's sizeof = 4
**char_array2's sizeof = 1

3. 二维数组和二维指针的赋值问题
char *str2 [20]={"helloworld","example"};
char **p2 = str2; //可以正确打印
int y;
for(y = 0;y < 2; y++){
printf("p2 = %s\n", p2[y]);
}


char str1[16][20]={"helloworld","example"};
char **p1 = str1;//像这样是错误的, 出现内存错误
int z;
for(z = 0;z < 2; z++){
printf("p1 = %s\n", p1[z]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值