二维char数组与二维char指针

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


1. 以下函数将出现段错误:
#include
#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]);
}

你可能感兴趣的:(c/c++)