【发布时间】:2017-04-30 17:03:29
【问题描述】:
本周我的同事讨论了一个关于记忆的问题:
示例代码 1:
int main()
{
#define Str "This is String."
char dest[1];
char buff[10];
strncpy(dest, Str, sizeof(Str));
printf("Dest: %s\n", dest);
printf("Buff: %s\n", buff);
}
输出:
Dest: This is String.
Buff: his is String.
示例代码 2:
int main()
{
#define Str "This is String."
char dest[1];
//char buff[10];
strncpy(dest, Str, sizeof(Str));
printf("Dest: %s\n", dest);
//printf("Buff: %s\n", buff);
}
输出:
Dest: This is String.
*** stack smashing detected ***: ./test terminated
Aborted (core dumped)
我不明白为什么我会在案例 1 中得到该输出?因为 buff 甚至没有在 strncpy 中使用,如果我注释变量 buff 它将检测到堆栈粉碎但输出为 dest。 同样对于buff为什么我将输出作为“他的字符串”。
【问题讨论】:
-
未定义的行为是未定义的。思考为什么会得到某种奇怪的输出,只有思考是什么导致了它,才能学到任何有意义的东西。
标签: c memory memory-management memory-leaks undefined-behavior