字符串指针赋值出错

建筑师 2015-07-29 12:30:53

void q2swap(char *a, char *b)
{
if(a[0]=='9') printf("==9\n"); //读没有问题
a[0]='8'; //写就出问题了,运行报错,系统甚至崩溃 为什么?

char *t; t=a;a=b;b=t; //不改变任何东西, 为什么?
}


...全文
462 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2015-07-31
  • 打赏
  • 举报
回复
代码本身没问题,问题可能在于你的 a不是合法的,由于不知楼主是怎么调用这函数的,所以说不清原因
wq327 2015-07-31
  • 打赏
  • 举报
回复
还有传参数不能传在静态常量区的数据,例如: char *p = "nihao";//这个是在静态常量区 char p[6] = "nihao";//这样子就不会出错了
wq327 2015-07-31
  • 打赏
  • 举报
回复

void q2swap(char *a, char *b)
{
    if(a[0]=='9') printf("==9\n");     //读没有问题
    a[0]='8';             //写就出问题了,运行报错,系统甚至崩溃     为什么?          
     
    char *t;      ×t=×a;×a=×b;×b=×t;           //不改变任何东西, 为什么?
}
这样试一试呢
布鲁克斯南南 2015-07-31
  • 打赏
  • 举报
回复
引用 7 楼 ant2012 的回复:
楼主确定为a开辟内存了?
我猜测、估计是没有,值声明了!
浪里狼 2015-07-31
  • 打赏
  • 举报
回复
得看传给形参的值的类型
自信男孩 2015-07-31
  • 打赏
  • 举报
回复
引用 15 楼 K8001 的回复:
[quote=引用 14 楼 cfjtaishan 的回复:] 函数:q2swap的第一个参数可能是只读的,你可以把你传递给q2swap函数的实参拿出来~主要看实参是不是只读的。

void q2()
{
	char *p1="9Compiling...";
	char *p2="6Linking...";
	char *p3="20 errors(s), 0 warning(s)...";

	q2swap(p1,p2);

	printf("Q2.String from small to big:\n%s\n%s\n%s\n",p1,p2,p3);
}
[/quote] 真是只读的,那不是字符串常量嘛,只可以读,不可以写的,即不可以修改~解决办法是申请空间,不论是栈上的,还是堆上的都可以,把字符串拷贝到新申请的空间里
love1code 2015-07-30
  • 打赏
  • 举报
回复
先来看这句话:“读没有问题,写就报错了”。
原因:字符串本身在静态区,而不是栈里。静态区一般是不允许改写的。
如: int *p="ABC";
p[0]='1' //error ,静态区数据可读不可写。
避免以上问题,把字符串定义在栈里就OK了。
char s[]="ABC";

第二个问题。/
说明你还没理解指针有什么用,c语言函数的值传参本质。
记住:C语言实参传递给形参都是按值传递的。
# include <stdio.h>
void q2swap(char *a, char *b);
int main (void)
{

char s1[]="123";
char s2[]="ABC";

q2swap(s1,s2); //调用


return 0;
}



void q2swap(char *a, char *b)
{
if(a[0]=='9') printf("==9\n"); //读没有问题
a[0]='8'; //写就出问题了,运行报错,系统甚至崩溃 为什么?

char *t; t=a;a=b;b=t; //不改变任何东西, 为什么?
}

我么看分析内存上发生了什么事(这个很重要)

也就是说,你在函数内操作的指针和原来的字符串的指针是不同的对象。只不过他们的值相等而已。
彩墨轩 2015-07-30
  • 打赏
  • 举报
回复
当函数的参数为指针时,如果不能保证指针的指向有效,则所有的一切都没有意义。
w291459260 2015-07-30
  • 打赏
  • 举报
回复
你只是改变存放变量的地址,但是指向的内容没变啦
赵4老师 2015-07-29
  • 打赏
  • 举报
回复
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
FightForProgrammer 2015-07-29
  • 打赏
  • 举报
回复
a指向的内存区域是只读的。
建筑师 2015-07-29
  • 打赏
  • 举报
回复
引用 14 楼 cfjtaishan 的回复:
函数:q2swap的第一个参数可能是只读的,你可以把你传递给q2swap函数的实参拿出来~主要看实参是不是只读的。

void q2()
{
	char *p1="9Compiling...";
	char *p2="6Linking...";
	char *p3="20 errors(s), 0 warning(s)...";

	q2swap(p1,p2);

	printf("Q2.String from small to big:\n%s\n%s\n%s\n",p1,p2,p3);
}
自信男孩 2015-07-29
  • 打赏
  • 举报
回复
函数:q2swap的第一个参数可能是只读的,你可以把你传递给q2swap函数的实参拿出来~主要看实参是不是只读的。
FightForProgrammer 2015-07-29
  • 打赏
  • 举报
回复
并不是指针本身,而是指针指向的内容是否可以修改
引用 5 楼 K8001 的回复:
[quote=引用 1 楼 FightForProgrammer 的回复:] a指向的内存区域是只读的。
谭浩强书上有如下的代码:

void copy_string(char *from ,char *to )
{
   for(;*from!='\0';from++,to++)
                   *to = * from;

   *to='\0';
}
这么看是可以赋值的啊[/quote]
均陵鼠侠 2015-07-29
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
[quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:]
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
不是C语言内的东西,拿出来宣扬只能被认为是诲盗诲淫。[/quote] link不是c语言写的?[/quote] 有可能不是。
赵4老师 2015-07-29
  • 打赏
  • 举报
回复
引用 3 楼 sholber 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:]
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
不是C语言内的东西,拿出来宣扬只能被认为是诲盗诲淫。[/quote] link不是c语言写的?
赵4老师 2015-07-29
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0)
char   *p1="1" ,*p2="2" ;
char    c1=1   , c2=2   ;
short   s1=1   , s2=2   ;
int     i1=1   , i2=2   ;
__int64 I1=1i64, I2=2i64;
float   f1=1.0f, f2=2.0f;
double  d1=1.0 , d2=2.0 ;
void main() {
    SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);
    SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);
    SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);
    SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);
    SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);
    SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);
    SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);

    SWAP(c1,c1);
    printf("%d\n",c1);
}
//char *         2,       1
//char           2,       1
//short          2,       1
//int            2,       1
//__int64     2,    1
//float          2,       1
//double        2,      1
//2
wang0635 2015-07-29
  • 打赏
  • 举报
回复
引用 8 楼 wang0635 的回复:
传给形参a的实参应该是数组名
而不是一个指针,简单地把一个字符串首地址赋值给他(就像谭浩强那样)
wang0635 2015-07-29
  • 打赏
  • 举报
回复
传给形参a的实参应该是数组名
二班的码农 2015-07-29
  • 打赏
  • 举报
回复
楼主确定为a开辟内存了?
加载更多回复(4)

70,023

社区成员

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

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