到目前为止,我已经能够尽职尽责地回答我所有的问题,但这个问题让我很困惑。
所以。我已经将这段代码缩减到了产生错误所必需的最小值。下面是:
#include <studio.h>
struct string {
char *data;
} s;
int main(int argc, char *argv[])
{
printf("Enter a string. ");
scanf("%s\n", &s.data);
printf("%s", s.data);
return 0;
}我使用gcc 4.6.3,用-Wall -g编写,使用经典的防御性编程策略。
我从手机上发了这个,所以可能会有打字和自动更正的疯狂。
发布于 2014-11-20 09:04:48
当使用scanf时,要使用unallocated pointer作为字符串读取,请指定'm'指令,强制scanf在跳过换行符时根据需要分配内存。您负责分配给字符串的freeing the memory。scanf期望提供的指针为char**类型。
scanf ("%m[^\n]%*c", &s.data);尾随的%*c读取并丢弃尾随换行符。(如果您只按[enter]键,请注意这一点)
发布于 2014-11-20 08:49:49
您需要首先使用malloc分配内存。
s.data = malloc(100);
发布于 2014-11-20 08:51:52
它在结构中的事实并不是问题所在。问题是指针数据没有初始化,也没有要复制的东西的内存。
这解决了问题:
struct string
{
char data [SOMEBIGNUMBER]
} s;这样做也是如此:保持字符串的原样,但是使用malloc在main中为数据分配空间。
https://stackoverflow.com/questions/27035212
复制相似问题