动态字符串数组不起作用

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 行,您正在访问内存的地方,您还没有分配,这最终被您的系统捕获并且,因此产生了分段错误。

但我认为,我们最好亲自了解一下您的代码。

  1. int i; 行中声明的变量 i 没有在您发布的代码中的任何地方使用,但我想您稍后需要它。
  2. 第一段不正确的代码在第二行中,您在其中声明了一个字符串数组或 char**。这意味着您有一个指向字符指针的指针。所以,你真正想做的是为这些指针分配内存,而不是为它们将指向的字符分配内存。请注意,char 消耗的内存量与 char* 不同。因此,这条线是要搭配的。

    char** strarr = (char**) calloc(argc, sizeof(char*));
    

    这将为 argc 内存块分配内存,每个内存块的大小为 4 或 8 字节,具体取决于您的系统是 32 位还是 64 位。

  3. 您在检查 calloc 函数是否返回 NULL 方面做得非常好,总体而言这是一个很好的做法。

  4. 接下来,您需要为指针指向的字符串本身分配内存,您在上一行中为其分配了内存。这些行就可以了。

    for (int i = 0; i < argc; i++) {
        strarr[i] = (char*) calloc(1000, sizeof(char));
    }
    

    这将为我们的 argc 大小的字符串数组的每个元素分配 1000 个字符长度的字符串。

之后,您可以按原样继续您的代码,我认为不会产生任何错误。请接受我的额外建议。学会爱上 valgrind。这是一个非常有用的程序,您可以 运行 您的代码使用它来分析内存。这是我的第一步,每当我遇到分段错误时。