strncpy 段错误,但可以手动分配字符串

strncpy seg fault, but am able to assign string manually

我有一个指向 char 数组的全局指针(我相信在堆栈上?)定义为:

char *history[BUFFER_SIZE];

在一个方法中,我只想:

strncpy(history[0], str, length);

它会出现故障。这对我来说没有意义,因为:

history[0] = "a string"

没有段错误。

我的问题:

  1. 因为我是这样定义 char 数组的数组,所以我不应该做任何类型的 malloc 或初始化,对吗?
  2. 为什么会出现段错误?

history 是一个指针数组,您不能将整个字符串复制到大小只有 32b 或 64b 的内容。

实际上,您必须分配与指针关联的内存,无论是在堆栈还是堆上。第二个例子,你在将它的地址分配给指针堆栈之前为字符串分配了内存。

char *history[BUFFER_SIZE]; 是指向任何地方的 char* 数组。当您尝试 strncpy 这些指针时,您会调用未定义的行为(因为它们指向任何地方),并且您会看到这表现为段错误。

当您 history[0] = "a string"char* 分配给 history[0] 时,因此 history[0] 不再指向任何地方,它指向 "a string""a string" 是一个字符串文字,存储在程序的其他地方,很可能是只读部分。 history[0]实际上并不包含数据"a string",它只是包含"a string"所在的地址。

Since I am defining the array of char arrays like this, I shouldn't have to do any sort of malloc or initialization, correct?

这取决于你想做什么。执行 history[0] = "a string" 完全没问题,只要知道尝试修改该字符串也是未定义的行为,因为它是字符串文字。如果您想将字符串文字复制到一段内存中,您可以在其中自由修改副本,则必须使用 malloc 或类似的方法分配一些内存。但是 char *history[BUFFER_SIZE]; 没有定义 "array of char arrays",它定义了一个 char 指针数组。