为什么我使用strncpy复制的字符串有垃圾而不是最后一个字符?

时间:2016-02-04 18:23:46

标签: c string malloc strlen strncpy

我malloc'd一个名为“locations”的结构数组。在所述结构中是称为“国家”的元素。我在下面创建了一个字符串,其中包含“美国”。我malloc'd空间来保存字符串(我需要这样做)并尝试使用strncpy将字符串放入malloced空间。

这在我的代码中的其他地方使用从文件读入的字符串,但不是我直接声明的字符串。

当我打印出结果时,它说结构是“United State(错误符号)”

因此,代替“美国”末尾的s是错误符号。

错误符号看起来像一小块1和0。

char *US_string = "United States";
locations[0].country = malloc(sizeof(US_string));
strncpy(locations[0].country, US_string, strlen(US_string));

任何人都知道发生了什么事?

感谢您的帮助!请尽量不要对我太过刻意,我是CS专业的第一年。只是想把这个bug从实验室中拿出来。

2 个答案:

答案 0 :(得分:1)

需要通过将1添加到帐户'\0'来调整mallocing。此外,sizeof(US_string)将给出指针的大小,这可能与实际的字符串大小不同。因此

locations[0].country = malloc(strlen(US_string) + 1);

并且缺少locations[0].country[strlen(US_string)] = '\0'

答案 1 :(得分:1)

sizeof将返回指针大小,而不是字符串大小。使用strlen +1(代表0字符串终止字符):

locations[0].country = malloc(strlen(US_string)+1);