动态字符串数组不起作用
Dynamic String array dosent work
我正在尝试使用 calloc 创建一个包含 1000 个字符长字符串的动态数组:
int i;
char** strarr =(char**)calloc(argc,sizeof(char)*1000);
if(strarr == NULL)
return 0;
strarr[0][0] ='a';
printf("%c\n",strarr[0][0]);
每次我尝试 运行 这段代码时,我都会在 printf 行遇到分段错误,我不明白为什么会发生这种情况(您可以假设 argc 大于 0)
谢谢
P.s。对不起,代码是文本格式,但我使用的是手机,所以我没有代码功能
试试这个:
const int num_of_strings = 255; //argc ?
const int num_of_chars = 1000;
int i;
char** strarr =(char**)malloc(sizeof(char*)*num_of_strings);
if(strarr == NULL)
return 0;
for (i = 0; i < num_of_strings; i++) strarr[i] = (char*)malloc(sizeof(char)*num_of_chars);
您好,欢迎来到未定义行为的世界,这是 C 语言最黑暗的领域之一。您的代码有几个问题,在某些情况下会导致未定义的行为,但它们都会被执行,直到您到达 printf
行,您正在访问内存的地方,您还没有分配,这最终被您的系统捕获并且,因此产生了分段错误。
但我认为,我们最好亲自了解一下您的代码。
- 在
int i;
行中声明的变量 i 没有在您发布的代码中的任何地方使用,但我想您稍后需要它。
第一段不正确的代码在第二行中,您在其中声明了一个字符串数组或 char**
。这意味着您有一个指向字符指针的指针。所以,你真正想做的是为这些指针分配内存,而不是为它们将指向的字符分配内存。请注意,char
消耗的内存量与 char*
不同。因此,这条线是要搭配的。
char** strarr = (char**) calloc(argc, sizeof(char*));
这将为 argc 内存块分配内存,每个内存块的大小为 4 或 8 字节,具体取决于您的系统是 32 位还是 64 位。
您在检查 calloc
函数是否返回 NULL 方面做得非常好,总体而言这是一个很好的做法。
接下来,您需要为指针指向的字符串本身分配内存,您在上一行中为其分配了内存。这些行就可以了。
for (int i = 0; i < argc; i++) {
strarr[i] = (char*) calloc(1000, sizeof(char));
}
这将为我们的 argc 大小的字符串数组的每个元素分配 1000 个字符长度的字符串。
之后,您可以按原样继续您的代码,我认为不会产生任何错误。请接受我的额外建议。学会爱上 valgrind。这是一个非常有用的程序,您可以 运行 您的代码使用它来分析内存。这是我的第一步,每当我遇到分段错误时。
我正在尝试使用 calloc 创建一个包含 1000 个字符长字符串的动态数组:
int i;
char** strarr =(char**)calloc(argc,sizeof(char)*1000);
if(strarr == NULL)
return 0;
strarr[0][0] ='a';
printf("%c\n",strarr[0][0]);
每次我尝试 运行 这段代码时,我都会在 printf 行遇到分段错误,我不明白为什么会发生这种情况(您可以假设 argc 大于 0) 谢谢
P.s。对不起,代码是文本格式,但我使用的是手机,所以我没有代码功能
试试这个:
const int num_of_strings = 255; //argc ?
const int num_of_chars = 1000;
int i;
char** strarr =(char**)malloc(sizeof(char*)*num_of_strings);
if(strarr == NULL)
return 0;
for (i = 0; i < num_of_strings; i++) strarr[i] = (char*)malloc(sizeof(char)*num_of_chars);
您好,欢迎来到未定义行为的世界,这是 C 语言最黑暗的领域之一。您的代码有几个问题,在某些情况下会导致未定义的行为,但它们都会被执行,直到您到达 printf
行,您正在访问内存的地方,您还没有分配,这最终被您的系统捕获并且,因此产生了分段错误。
但我认为,我们最好亲自了解一下您的代码。
- 在
int i;
行中声明的变量 i 没有在您发布的代码中的任何地方使用,但我想您稍后需要它。 第一段不正确的代码在第二行中,您在其中声明了一个字符串数组或
char**
。这意味着您有一个指向字符指针的指针。所以,你真正想做的是为这些指针分配内存,而不是为它们将指向的字符分配内存。请注意,char
消耗的内存量与char*
不同。因此,这条线是要搭配的。char** strarr = (char**) calloc(argc, sizeof(char*));
这将为 argc 内存块分配内存,每个内存块的大小为 4 或 8 字节,具体取决于您的系统是 32 位还是 64 位。
您在检查
calloc
函数是否返回 NULL 方面做得非常好,总体而言这是一个很好的做法。接下来,您需要为指针指向的字符串本身分配内存,您在上一行中为其分配了内存。这些行就可以了。
for (int i = 0; i < argc; i++) { strarr[i] = (char*) calloc(1000, sizeof(char)); }
这将为我们的 argc 大小的字符串数组的每个元素分配 1000 个字符长度的字符串。
之后,您可以按原样继续您的代码,我认为不会产生任何错误。请接受我的额外建议。学会爱上 valgrind。这是一个非常有用的程序,您可以 运行 您的代码使用它来分析内存。这是我的第一步,每当我遇到分段错误时。