所以我试图反转一个字符串,但是我遇到了内存故障。 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);
}
答案 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
最好在使用后释放内存。