问个很基础的问题 为什么会段错误

kai843522 2012-10-18 04:07:36

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


void reverse_string(char *string)
{
char *last_char;
for(last_char = string; *last_char != '\0'; last_char++)
;
last_char--;


while(string<last_char)
{

char temp;
temp = *string;
*string++ = *last_char;
*last_char-- = temp;

}

}

int main()
{
char *str = (char *)malloc(sizeof(char)*20);
str = "123456abcdef";
printf("str1 = %s\n",str);
reverse_string(str);
printf("str2 = %s\n",str);
free(str);
str = NULL;
}



把str换成数组的话 就可以执行 是不是因为字符串常量的问题?请问合理的解释应该怎么回答呢。。
...全文
138 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
如影随从 2012-10-19
  • 打赏
  • 举报
回复
2楼正解,今天刚帮别人解决了这个问题。char*类型的赋值不能直接赋值,要用strcpy来进行拷贝。string和CString类型的才是直接赋值的。
赵4老师 2012-10-19
  • 打赏
  • 举报
回复
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写。后果自负。
AnYidan 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

楼上都说到了,char *pstr = "abcde" 这种形式的pstr地址域只能读不能写的。
"abcde" 表示的是一个指向一个只读区的指针(内容为ancde)。
[/Quote]

++
十八道胡同 2012-10-19
  • 打赏
  • 举报
回复
如果这段内存你可以写,那么你才能翻转他。
kai843522 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:
为什么我把main函数改成strcpy(str,"123456") 还是会产生段错误呢,把“123456”放在一个数组里传进去就可以

str是一个char*,也就是字符指针
请问楼主,这个字符指针在strcpy前指向哪里?

真心不明白,为啥总有人认为char*等于字符串等于自己管理内存等于要多少有多少内存
[/Quote]
忘记malloc了- - 谢谢
cfvmario 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:
2楼正解,今天刚帮别人解决了这个问题。char*类型的赋值不能直接赋值,要用strcpy来进行拷贝。string和CString类型的才是直接赋值的。


int main()
{
char *str;
strcpy(str,"123456");
printf("str1 = %s\n",str);
reverse_st……
[/Quote]
str没初始化,是个随机地址,也许这代码有时正常,但更多的时候str内的地址无效,拷贝过程直接崩溃吧。。
baichi4141 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
为什么我把main函数改成strcpy(str,"123456") 还是会产生段错误呢,把“123456”放在一个数组里传进去就可以
[/Quote]
str是一个char*,也就是字符指针
请问楼主,这个字符指针在strcpy前指向哪里?

真心不明白,为啥总有人认为char*等于字符串等于自己管理内存等于要多少有多少内存
kai843522 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
2楼正解,今天刚帮别人解决了这个问题。char*类型的赋值不能直接赋值,要用strcpy来进行拷贝。string和CString类型的才是直接赋值的。
[/Quote]

int main()
{
char *str;
strcpy(str,"123456");
printf("str1 = %s\n",str);
reverse_string(str);
printf("str2 = %s\n",str);
return 0;
}

为什么我把main函数改成strcpy(str,"123456") 还是会产生段错误呢,把“123456”放在一个数组里传进去就可以


zfeng_cc 2012-10-18
  • 打赏
  • 举报
回复
楼上都说到了,char *pstr = "abcde" 这种形式的pstr地址域只能读不能写的。
"abcde" 表示的是一个指向一个只读区的指针(内容为ancde)。
图灵狗 2012-10-18
  • 打赏
  • 举报
回复

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


void reverse_string(char *string)
{
char *last_char;
for(last_char = string; *last_char != '\0'; last_char++)
;
last_char--;


while(string<last_char)
{

char temp;
temp = *string;
*string++ = *last_char;
*last_char-- = temp;

}

}

int main()
{
//char *str = (char *)malloc(sizeof(char)*20);
//str = "123456abcdef";
char str[20] = "123456abcdef";
printf("str1 = %s\n",str);
reverse_string(str);
printf("str2 = %s\n",str);
//free(str);
//str = NULL;
return 0;
}

dpdp_2012 2012-10-18
  • 打赏
  • 举报
回复
str = "123456abcdef";指向一个常量,不能修改
改为: strcpy(str,"123456abcdef");

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧