2013-04-05 154 views
0

我刚刚学习C,有人可以解释为什么在打印数组的第一个元素后,下面的代码会产生分段错误?将字符串数组传递给函数C

工作代码的外观如何?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define ELEMENTS 8 

void make(char ***array) { 

*array = malloc(ELEMENTS * sizeof(char *)); 


    (*array)[0] = "test0"; 
    (*array)[1] = "test1"; 
    (*array)[2] = "test2"; 
    (*array)[3] = "test3"; 
    (*array)[4] = "test4"; 
    (*array)[5] = "test5"; 
    (*array)[6] = "test6"; 
    (*array)[7] = "test7"; 
    (*array)[8] = "test8"; 

} 

int main(int argc, char **argv) 
{ 
char **array; 
make(&array); 

int i; 
for (i = 0; i < ELEMENTS; ++i) { 
    printf("%s\n", array[i]); 
    free(array[i]); 
} 
free(array); 
return 0; 

}

+1

其实,你需要阅读很多关于投注者,只是谷歌它,你会得到乐趣的信息... – Castiblanco 2013-04-05 13:35:16

回答

0

当你把一个文本字符串在C++一样"test0",它实际上是存储在一个特殊的存储器位置不能被修改。在线

(*array)[0] = "test0"; 

你指着你的char*到那个内存位置,这是没问题的。但是,稍后,当您拨打free(array[i]);时,您正试图释放相同的内存,这是一个禁忌。一般情况下,如果以前在同一变量上使用malloc(),则只能使用free()。另外,正如其他人所说的,由于您使用了9个元素,因此您需要分配一个9号数组。

6
  1. 你的数组大小是8,但你访问索引8,这是一个过去的数组的末尾。如果您不明白,请计算元素的数量...

  2. 您在指定的字符串常量上调用free。不要这样做。只有freemalloc,它只是array,而不是array[0]array[8]