0
A
回答
3
这是未定义的行为。你不能改变文字。
有一个指针指向字面,它应该是:
const char* str = "Hello";
//^^^^^
然后,为了能够改变字符串,这是应该的,例如
char str[] = "Hello";
另一种选择是分配动态存储器(使用malloc
和free
)
1
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”;
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是一个指向字符串常量的指针,并且该字符串的内存分配在只读段中。如果你尝试修改字符串内容,结果是不确定的。但是,与总是绑定到相同内存位置的数组名相比,您可以修改指向其他指针的指针。
相关问题
- 1. 指针算术不起作用
- 2. 指针算术
- 3. C++指针算术
- 4. C指针算术
- 5. 指针通过指针不起作用
- 6. 简单的指令不起作用
- 7. 指针算术帮助
- 8. 释放指针算术
- 9. 指针算术问题
- 10. 指针算术符号
- 11. C++算术具有指针
- 12. void *与char *指针算术
- 13. nullptr和指针算术
- 14. 算术指针和fstream C++
- 15. 指针算术问题
- 16. 指针算术的澄清
- 17. python ctypes指针算术
- 18. 指针到指针的算术表现不如预期
- 19. 指针指针之类的指针之类的算术
- 20. 指针算术和解引用
- 21. 简单Calaculator不起作用
- 22. 简单的c#算术。 winForms
- 23. 带有算术运算的CSS变量在简写属性中不起作用?
- 24. 这个指针算法为什么不起作用?
- 25. 指针在printf()中不起作用
- 26. Singleton类指针分配不起作用
- 27. 对象指针不起作用
- 28. C编程和argv(指针算术)
- 29. 数组指针算术问题
- 30. 在Python模拟指针算术
因此,编译器发现错误,或者当我尝试重写那个内存位置时,程序崩溃了? – user1091856 2012-08-13 07:21:11
@ user1091856 - 如果编译器已经捕获到它,那么会出现编译器错误。如果程序崩溃,它会立即退出。但没有必要崩溃。你不能改变这个记忆,如果你想改变它,任何事情都可能发生。这就是为什么它是_undefined behaviour_。 – 2012-08-13 07:23:20