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]);
}
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]);
}