C 动态字符串数组dosent功

C 动态字符串数组dosent功,c,arrays,dynamic-arrays,calloc,C,Arrays,Dynamic Arrays,Calloc,我正在尝试使用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) 谢谢 另外,很抱歉

我正在尝试使用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) 谢谢

另外,很抱歉代码是文本格式的,但我使用的是手机,所以我没有代码功能

试试这个:

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);
const int num_of_string=255//argc?
const int num_of_chars=1000;
int i;
char**strarr=(char**)malloc(sizeof(char*)*num_of_字符串);
如果(strarr==NULL)
返回0;
对于(i=0;i
大家好,欢迎来到未定义行为的世界,这是C语言最黑暗的领域之一。您的代码有几个问题,这些问题在某些情况下会导致未定义的行为,但它们都会被执行,直到您到达
printf
行,在该行中访问内存时,您尚未分配内存,这最终会被您的系统捕获,从而产生分段错误

但我认为,最好是自己浏览一下你的代码

  • 变量i,在
    inti中声明行在您发布的代码中的任何地方都没有使用,但我想您以后需要它
  • 不正确的第一段代码位于第二行,在这里声明字符串数组或
    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));
    }
    
    for(int i=0;i
    这将为argc大小的字符串数组的每个元素分配1000个字符长的字符串


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

    strarr[0]
    是一个空指针
    strarr[0][0]
    是未定义的行为。