Q
C堆栈分配
1
A
回答
3
没有分配在堆栈上,它是一个字符串文字。
不,你不能修改它。您的编译器可以将该字符串放在只读内存段中(如果您的实现有这样的概念)。试图改变它导致未定义的行为。
(它崩溃的Linux上使用缺省的GCC编译实例的选项。)
7
字符串不是在堆栈中。指向它的指针(arr
)是。修改字符串文字是未定义的行为。
您可以在ASM GCC很清楚地看到这产生于86:
.file "test.c"
.section .rodata
.LC0:
.string "abc" ; String literal inside .rodata section
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $.LC0, -4(%ebp) ; Pointer to LC0 (our string onto stack)
movl -4(%ebp), %eax ; Pointer is copied into eax register
movb $99, (%eax) ; Copy $99 ('c') to what eax points to (in .rodata)
5
您的代码不会在栈上分配一个字符串。它在堆栈上分配一个char*
,也就是指针,它使指针指向字符串文字。尝试修改字符串文字是未定义的行为。
要分配字符串在栈上,做到:
char arr[] = "abc";
现在你已经采取了串您的堆栈分配的数组arr
在文本的副本,你可以修改该副本。
对于完整的步骤:我所描述的“栈分配”技术上都是“自动变量”。 C本身并不关心它们被分配的位置,但我可以猜测出你的实现确实把它们放在堆栈上。
相关问题
- 1. C++堆栈与堆分配
- 2. C中的堆栈分配
- 3. C++循环堆栈分配
- 4. C++是堆栈还是堆分配?
- 5. 堆栈或堆栈分配不正确
- 6. C++中的动态堆栈分配
- 7. C - 堆栈分配的链表
- 8. C++ 11堆栈分配vs Unique_Ptr
- 9. 基于C++堆栈的对象分配
- 10. 动态分配stdlib堆栈?
- 11. 堆栈帧内存分配
- 12. PIMPL和堆栈分配
- 13. 堆栈或堆上的对象分配
- 14. 堆/堆栈上的类成员分配?
- 15. 堆VS数据段VS堆栈分配
- 16. 从堆分配时堆栈溢出
- 17. 检测堆栈或堆分配
- 18. C++在堆和堆栈上分配内存?
- 19. 覆盖率和C++:堆(与新)与堆栈分配
- 20. 堆栈溢出:在堆栈空间中复制临时分配?
- 21. 堆栈上字符串的分配
- 22. 基于堆栈的内存分配
- 23. 堆栈分配,填充和对齐
- 24. POSIX调用堆栈内存分配
- 25. 堆栈上分配多少空间
- 26. 未初始化值由堆栈分配
- 27. 明确堆栈分配的数据
- 28. 检查堆栈分配是否失败?
- 29. 动态堆栈内存重新分配
- 30. C++堆栈分配的对象分配和析构函数调用
http://stackoverflow.com/questions/2036096/literal-string-initializer-for-a-character-array – kan