user-0 提问: 字符串指针赋值出错

回复:
user: user-1
content: 代码本身没问题，问题可能在于你的 a不是合法的，由于不知楼主是怎么调用这函数的，所以说不清原因

user: user-2
content: 还有传参数不能传在静态常量区的数据，例如： char *p = "nihao";//这个是在静态常量区 char p[6] = "nihao";//这样子就不会出错了

user: user-2
content: void q2swap(char *a, char *b) {     if(a[0]=='9') printf("==9\n");     //读没有问题     a[0]='8';             //写就出问题了,运行报错,系统甚至崩溃     为什么?                     char *t;      ×t=×a;×a=×b;×b=×t;           //不改变任何东西, 为什么? }  这样试一试呢

user: user-3
content: 引用 7 楼 ant2012 的回复:楼主确定为a开辟内存了？  我猜测、估计是没有，值声明了！

user: user-4
content: 得看传给形参的值的类型

user: user-5
content: 引用 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] 真是只读的，那不是字符串常量嘛，只可以读，不可以写的，即不可以修改~解决办法是申请空间，不论是栈上的，还是堆上的都可以，把字符串拷贝到新申请的空间里

user: user-6
content: 先来看这句话：“读没有问题，写就报错了”。 原因：字符串本身在静态区，而不是栈里。静态区一般是不允许改写的。 如： 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;           //不改变任何东西, 为什么? } 我么看分析内存上发生了什么事（这个很重要）  也就是说，你在函数内操作的指针和原来的字符串的指针是不同的对象。只不过他们的值相等而已。

user: user-7
content: 当函数的参数为指针时，如果不能保证指针的指向有效，则所有的一切都没有意义。

user: user-8
content: 你只是改变存放变量的地址，但是指向的内容没变啦

user: user-9
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-10
content: a指向的内存区域是只读的。

user: user-0
content: 引用 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); }

user: user-5
content: 函数：q2swap的第一个参数可能是只读的，你可以把你传递给q2swap函数的实参拿出来~主要看实参是不是只读的。

user: user-10
content: 并不是指针本身，而是指针指向的内容是否可以修改  引用 5 楼 K8001 的回复:[quote=引用 1 楼 FightForProgrammer 的回复:] a指向的内存区域是只读的。  谭浩强书上有如下的代码:  void copy_string(char *from ,char *to ) {    for(;*from!='\0';from++,to++)                    *to = * from;     *to='\0'; }   这么看是可以赋值的啊[/quote]

user: user-11
content: 引用 11 楼 zhao4zhong1 的回复:[quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！   不是C语言内的东西，拿出来宣扬只能被认为是诲盗诲淫。[/quote] link不是c语言写的？[/quote]  有可能不是。

user: user-9
content: 引用 3 楼 sholber 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！   不是C语言内的东西，拿出来宣扬只能被认为是诲盗诲淫。[/quote] link不是c语言写的？

user: user-9
content: 仅供参考：#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

user: user-12
content: 引用 8 楼 wang0635 的回复:传给形参a的实参应该是数组名 而不是一个指针，简单地把一个字符串首地址赋值给他（就像谭浩强那样）

user: user-12
content: 传给形参a的实参应该是数组名

user: user-13
content: 楼主确定为a开辟内存了？