0

我刚刚学习 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;

}

4

2 回答 2

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

  2. 您调用free分配的字符串常量。不要这样做。只为freemalloc,即为array,不array[0]array[8]

于 2013-04-05T13:35:14.323 回答
0

当您将文字字符串放入 C++ 中"test0"时,它实际上存储在无法修改的特殊内存位置。在行

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

你将你指向char*那个内存位置,这是可以的。但是,稍后,当您调用 时free(array[i]);,您会尝试释放相同的内存,这是一个禁忌。通常,仅free()当您以前malloc()在同一变量上使用过时才使用。

此外,正如其他人所说,您需要分配一个大小为 9 的数组,因为您使用的是 9 个元素。

于 2013-04-05T13:38:54.283 回答