我使用的是64位linux
机器,所以我的指针大小是8个字节。所以看下面的代码,我在下面的程序中H
之后编写了段程序中的段错误(在strcpy()
)。但似乎没有发生。在下面的程序中,我认为它会超出并破坏x
中的内存。以下程序在我的系统上正常运行,但如果我在strcpy()
中添加了另一个字母,则会出现段错误。所以这样的问题显然是系统依赖的,但这个字符串怎么不会崩溃程序呢?我确实搜索过这样的问题,如果有一些链接,你也可以直接找我。提前谢谢。
int main()
{
int x;
char* c ;
x = 0xF0000000;
strcpy(&c,"ABCDEFGHFFFFFF");
x++;
printf("%X\n",x);
printf("%s\n",&c);
}
答案 0 :(得分:0)
关于C中的指针和内存管理:
表达式
char *c;
只创建指针,但它既没有为字符分配任何内存,也没有初始化指向已分配内存的指针。
你做得更好:
char c[20];
c
的行为就像一个指针,但同时你已经分配了一个20字节的缓冲区(在main
的堆栈帧中)和{{1}指向它的开始。
当使用字符串(字符指针)时,你不要c
到指针的地址,而是到指针所占的地址:
strcpy
正如旁注:表达式strcpy(c, "ABCDEFGHFFFFFF");
在文本文本中分配一个常量字符缓冲区,并在内存中分配终止零并返回其地址。这就是为什么这种用法是合法的。