2017-04-01 161 views
0

我试图使用释放calloc创造1000个字符长字符串动态数组:动态字符串数组dosent工作

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) 谢谢

Ps对不起,该代码是在文本格式,但使用im移动,所以我没有这个代码功能

+0

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

回答

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); 
+0

是的,这工作!非常感谢你 –

0

您好,欢迎来到世界的不确定的行为,最黑暗的地区之一的C语言。你的代码有几个问题,这些问题会在多个场合导致未定义的行为,但它们都会被执行,直到你到达printf行,你正在访问内存,你还没有分配,最终被系统捕获,因此,产生分段故障。

但我认为,最好是通过自己的代码走自己的路。

  1. 变量i,这是在int 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。这是一个非常有用的程序,您可以运行代码,以分析内存。这是我的第一步,每当我遇到分段错误时。