2012-08-13 110 views

回答

3

这是未定义的行为。你不能改变文字。

有一个指针指向字面,它应该是:

const char* str = "Hello"; 
//^^^^^ 

然后,为了能够改变字符串,这是应该的,例如

char str[] = "Hello"; 

另一种选择是分配动态存储器(使用mallocfree

+0

因此,编译器发现错误,或者当我尝试重写那个内存位置时,程序崩溃了? – user1091856 2012-08-13 07:21:11

+0

@ user1091856 - 如果编译器已经捕获到它,那么会出现编译器错误。如果程序崩溃,它会立即退出。但没有必要崩溃。你不能改变这个记忆,如果你想改变它,任何事情都可能发生。这就是为什么它是_undefined behaviour_。 – 2012-08-13 07:23:20

1

因为str的类型是“const char *”,所以你不能覆盖它指向的对象。

+0

如果你的意思是文字,它在技术上是'const char [6]',而不是'const char *'。 – chris 2012-08-13 07:19:00

+0

在类型安全方面...是的 – Yang 2012-08-13 07:23:53

2

字符串文字被分配在只读存储器中。所以基本上它们是类型的(const char *)。它不能被改变。 另请参阅this了解更多信息。

0
#include <string.h> 
char *str; 
if((str = malloc(strlen("hello"))) != NULL) 
    return (null); 
str = strcpy(str, "hello"); 
printf("%s\n", str); // should print hello 
str[2] = '3'; 
printf("%s\n", str) // should print he3lo 

的这里的事情是我先分配内存来设置字符串中的字符。 但是,如果你不擅长分配,你可以随时设置char str [] =“hello”;

+1

问题是,为什么在不需要时使用堆分配?它导致的一件事是缺少“免费”电话。 – chris 2012-08-13 07:31:02

+0

对此。不过,它是查看不同选项的好方法 – C404 2012-08-13 07:59:54

0

str的内存将分配在.rodata部分。所以试图修改只读数据会产生问题。

以下问题出现问题。

#include <stdio.h> 

int main() 
{ 
char * str = "Hello"; 

printf("\n%s \n", str); 
*(str+1) = '3'; 
printf("\n%s \n", str); 


return 0; 
} 

对应的拆卸

.file "dfd.c" 
     .section  .rodata 
.LC0: 
     .string "Hello" 
.LC1: 
     .string "\n%s \n" 
     .text 
    ..... 
    ..... 

,其结果是

Hello 
Segmentation fault (core dumped) 

im使用上X86_64 gcc版本4.6.3(Ubuntu的/ Linaro的4.6.3-1ubuntu5)。

0

str是一个指向字符串常量的指针,并且该字符串的内存分配在只读段中。如果你尝试修改字符串内容,结果是不确定的。但是,与总是绑定到相同内存位置的数组名相比,您可以修改指向其他指针的指针。