70,023
社区成员




void q2swap(char *a, char *b)
{
if(a[0]=='9') printf("==9\n"); //读没有问题
a[0]='8'; //写就出问题了,运行报错,系统甚至崩溃 为什么?
char *t; t=a;a=b;b=t; //不改变任何东西, 为什么?
}
void q2swap(char *a, char *b)
{
if(a[0]=='9') printf("==9\n"); //读没有问题
a[0]='8'; //写就出问题了,运行报错,系统甚至崩溃 为什么?
char *t; ×t=×a;×a=×b;×b=×t; //不改变任何东西, 为什么?
}
这样试一试呢
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]
真是只读的,那不是字符串常量嘛,只可以读,不可以写的,即不可以修改~解决办法是申请空间,不论是栈上的,还是堆上的都可以,把字符串拷贝到新申请的空间里# 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; //不改变任何东西, 为什么?
}
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
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);
}
void copy_string(char *from ,char *to )
{
for(;*from!='\0';from++,to++)
*to = * from;
*to='\0';
}
这么看是可以赋值的啊[/quote]#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