内存错误和指向字符串的指针

时间:2017-09-28 12:07:11

标签: c string pointers memory malloc

所以我试图反转一个字符串,但是我遇到了内存故障。 s和s1的内存初始化足以容纳' / 0'性格也是如此。

有趣的是,如果我删除* s = * s1并打印s1而不是程序有效。 但我甚至没有设置" \ 0" s1结束时的字符,那么它怎么知道在哪里停止打印?

在下面的案例中究竟是什么问题?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main(void)
{
    char *s = "abcdefghijklmnop", *s1=malloc(17);
    int i;  
    for(i=0;i<strlen(s);i++)
    {
        *(s1+i) = *(s+strlen(s)-1-i);
    }
    *s=*s1;
    printf("%s",s);
}

2 个答案:

答案 0 :(得分:3)

char *s = "abcdefghijklmnop"是一个字符串文字,通常位于只读内存中。 如果您尝试修改字符串文字,则会生成错误。

当您执行s时,尝试将s1中的第一个字符替换为*s=*s+1中的第一个字符。

如果s不是字符串文字,那么您应该s=s1而不是*s=*s1使其s反转。

更多相关信息:

https://softwareengineering.stackexchange.com/questions/294748/why-are-c-string-literals-read-only
String literals: Where do they go?
where in memory are string literals ? stack / heap?

正确的字符串打印时会显示printf("%s", s1);,即使没有存储\0,因为最后一个字符旁边的内存恰好是0,相当于\0 。由于malloc()没有初始化它分配的内存,所以不必依赖不能

但是calloc() 初始化它分配给0的内存。

查看更多here

答案 1 :(得分:0)

在您的代码 source target 1 1 5 2 2 6 3 3 7 4 4 1 5 5 4 中,只将s1的第一个内容复制到s中。即,*s=*s1不是整个字符串。所以我们需要将s1的地址分配给s。即,*(s+0)=*(s1+0)

s=s1

最好在使用后释放内存。