【发布时间】:2016-08-21 17:30:39
【问题描述】:
即使我分配 0 字节,程序也能正常工作。我做错了吗?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str;
printf("memory address of str %p %p\n",&str,str);
/* Initial memory allocation */
str = (char*)malloc(0);
printf("memory address of str %p %p\n",&str,str);
strcpy(str,"abc");
printf(" string = %s %p %p\n", str,&str, str);
free(str);
return(0);
}
【问题讨论】:
-
这取决于你所说的“作品”。
-
如果您的程序一定会崩溃,那将是定义的行为。但是就像你的车在你离开驻车制动器时不能保证滚滚,如果你不系鞋带你不能保证摔倒,结果是undefined。跨度>
-
我的意思是我为字符串 abc 分配了 0 个字节
-
您分配了 0 个字节,这意味着根据规范您不能取消引用该指针。但是,这不是由编译器强制执行的。因此,稍后将超过 0 个字节复制到该内存中不一定会立即使您的程序崩溃。这确实意味着您的程序处于未定义状态,以后的各种调用可能会崩溃。
-
C 语言没有适合初学者的辅助工具。您负责分配足够的内存。您有责任确保代码不会尝试访问越界的内存。