gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:15:24 26 4
gpt4 key购买 nike

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

char *history[BUFFER_SIZE];

在一个方法中我只想:

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

它会分割错误。这对我来说没有意义,因为:

history[0] = "a string"

没有段错误。

我的问题:

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

最佳答案

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]; 没有定义“char 数组的数组”,它定义了一个 char 指针数组。

关于c - strncpy 段错误,但可以手动分配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46983227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com