2014-09-22 53 views
-6

我使用一个64位linux机器,所以我的指针的大小是8个字节,所以看下面的代码,我写了下面的程序段落H在我的字符串(在strcpy())。但似乎并没有发生。在下面的程序中,我认为它会溢出并破坏x中的内存。这下面的程序在我的系统上运行良好,但如果我在strcpy()中添加另一个字母,它会出现段错误。所以这样的问题显然与系统有关,但是这个字符串是如何不使程序崩溃的呢?我确实在寻找这样一个问题,如果有一些链接存在,你也可以指导我。提前致谢。如何在C中处理字符串?

int main() 
{ 

int x; 
char* c ; 

x = 0xF0000000; 

strcpy(&c,"ABCDEFGHFFFFFF"); 
x++; 
printf("%X\n",x); 

printf("%s\n",&c); 

}

+4

我看到你已经声明了一个指针......但它指向什么? – 2014-09-22 20:48:08

+0

当然它要和警告编译,但它确实给我一个输出为以下 'F0000001 ABCDEFGHFFFFFF' 我现在这肯定你如何写常规程序,我只是想看看字符串被复制,你是大家一定没有答案。 – 2014-09-22 20:52:19

+0

你的程序简直就是UB,没什么有用的争论。如果你想知道在特定运行情况下你的情况究竟是什么,请将调试器分解出来并单步执行。请注意,使用调试器可能会改变程序行为。 – Deduplicator 2014-09-22 20:54:42

回答

0

作为在C指针和内存管理:

  • 必须手动创建指针
  • 你必须分配内存手动
  • 你必须初始化指向手动指向分配的内存的指针

表达

char *c; 

只创建指针,但它也不分配用于字符的任何存储器,也没有指针它初始化到所分配的内存。

你用好得多:

char c[20]; 

c会像一个指针,但在同一时间,你已经分配一个20字节的缓冲区(在main的堆栈帧)和c正指向它的开始。

当使用字符串(字符指针),你不strcpy指针的地址,而是通过指针持有地址:

strcpy(c, "ABCDEFGHFFFFFF"); 

正如一个侧面说明:表达"ABCDEFGHFFFFFF"分配一个常量字符缓冲区,包含文本文本和内存中的终止零并返回其地址。这就是为什么这种用法是合法的。