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"
没有段错误。
我的问题:
- 因为我是这样定义 char 数组的数组,所以我不应该做任何类型的 malloc 或初始化,对吗?
- 为什么会出现段错误?
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
指针数组。
我有一个指向 char 数组的全局指针(我相信在堆栈上?)定义为:
char *history[BUFFER_SIZE];
在一个方法中,我只想:
strncpy(history[0], str, length);
它会出现故障。这对我来说没有意义,因为:
history[0] = "a string"
没有段错误。
我的问题:
- 因为我是这样定义 char 数组的数组,所以我不应该做任何类型的 malloc 或初始化,对吗?
- 为什么会出现段错误?
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
指针数组。