我刚刚学习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;
}
答案 0 :(得分:6)
您的数组大小为8
,但您可以访问索引8
,这是一个超过数组末尾的索引。如果您不理解,请计算元素数量......
您在指定的字符串常量上调用free
。不要这样做。只有free
malloc
只有array
,而不是array[0]
到array[8]
。
答案 1 :(得分:0)
当您将文字字符串放在像"test0"
这样的C ++中时,它实际上存储在一个无法修改的特殊内存位置。在行
(*array)[0] = "test0";
您将char*
指向该内存位置,这是可以的。但是,稍后,当您调用free(array[i]);
时,您正试图释放相同的内存,这是禁忌。一般情况下,如果您之前在同一个变量上使用了free()
,则只能使用malloc()
。
另外,正如其他人所说,你需要分配一个大小为9的数组,因为你使用了9个元素。