LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: qing

C语言问题一则

[复制链接]
发表于 2005-4-1 11:25:50 | 显示全部楼层
i,can't spell chinese,so that,it's not my mistake to reply it in engling
i met the same problem in my work before,i gave up at that time,thanks for the head of the topic ,but ,you don't put out ,how to do with this problem ,i 'm waitting for it ~~
回复 支持 反对

使用道具 举报

发表于 2005-4-1 12:03:22 | 显示全部楼层
要解决这个问题也很简单,把
char* xyzstring = "hello,world!";
写成
char xyzstring[ ] ="hello,world!";
因为数组是在栈上分配的,其内存空间是可写的。
回复 支持 反对

使用道具 举报

发表于 2006-3-3 17:54:17 | 显示全部楼层
kj501 的意思是栈的内存空间是可以rewite的。
那堆的内存空间呢?
char* xyzstring = "hello,world!";
"hello,world!"是存放在堆中,请问堆中的内存是不可写的吗?
回复 支持 反对

使用道具 举报

发表于 2006-3-3 18:09:13 | 显示全部楼层
Post by lb343100
kj501 的意思是栈的内存空间是可以rewite的。
那堆的内存空间呢?
char* xyzstring = "hello,world!";
"hello,world!"是存放在堆中,请问堆中的内存是不可写的吗?

看原文的意思是
char * xyzstring ="hello,world!"
是存放在不可修改的.text段里面,你想修改里面的内容当然是段错误了。
回复 支持 反对

使用道具 举报

发表于 2006-3-4 20:11:05 | 显示全部楼层
将 .section    .rodata改为 .section    .data即可
Post by zhangqiang
有见地,顶一个
但是我用gcc编了一下
结果是
        .file   "xyz.c"
        .section        .rodata
.LC0:
        .string "hello,world!"
.globl xyzstring
        .data
        .align 4
        .type   xyzstring,@object
        .size   xyzstring,4
xyzstring:
        .long   .LC0
        .section        .rodata
.LC1:
        .string "%s\n"
        .text
.globl main
        .type   main,@function
main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        subl    %eax, %esp
        movl    xyzstring, %eax
        movb    $97, (%eax)
        subl    $8, %esp
        pushl   xyzstring
        pushl   $.LC1
        call    printf
        addl    $16, %esp
        movl    $0, %eax
        leave
        ret
.Lfe1:
        .size   main,.Lfe1-main
        .ident  "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
.s文件中本来就是.text啊
我编了之后运行是段错误
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表