将字符串数组传递给C中的函数

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

工作代码会是什么样的?

#include  #include  #include  #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; 

}

当你在C ++中放置一个像"test0"的文字字符串时,它实际上存储在一个特殊的内存位置,在那里它无法被修改。 在线

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

你将你的char*指向那个记忆位置,这是可以的。 但是,稍后,当你调用free(array[i]); ,你试图释放相同的记忆,这是一个禁忌。 通常,如果您之前在同一个变量上使用了malloc() ,则只使用free()

另外,正如其他人所说,你需要分配一个9号的数组,因为你使用的是9个元素。

  1. 您的数组大小为8 ,但您可以访问索引8 ,这是一个超过数组末尾的索引。 如果您不理解,请计算元素数量…

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