我正在尝试一个示例程序来了解通用交换函数。
/ *一个简单的通用交换函数* /
#include<stdio.h>
#include<string.h>
void swap(void* xp,void* yp,int size){
//void temp = *xp; // we cant declare a variable as void , as we need to konw to de-reference as its not specifying any size info
// Hence used the smallest type info - char
char buffer[size];
memcpy(buffer,xp,size);
memcpy(xp,yp,size);
memcpy(yp,buffer,size);
}
int main(){
int a = 10;
int b = 20;
double d=1.34;
double e=2.34;
char* s = "Hello";
char* t = "World";
printf("\n a : %s b : %s \n",s,t);
swap(s,t,sizeof(char*));
printf("\n a : %s b : %s \n",s,t);
return 0;
}
当我使用函数调用作为swap(s,t,sizeof(char *))运行上述程序时,我遇到了分段错误。但是如果我用swap(&amp; s,&amp; t,sizeof(char *))运行它,我就不会出现任何分段错误。
gdb o / p:
Breakpoint 2, swap (xp=0x4007ac, yp=0x4007b2, size=8) at swap_generic1.c:5
5 void swap(void* xp,void* yp,int size){
(gdb) s
8 char buffer[size];
(gdb) s
9 memcpy(buffer,xp,size);
(gdb) s
10 memcpy(xp,yp,size);
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b64fe4 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
可能是问题的原因。当作为s和t传递时,参数被赋予字符串的地址&#34; Hello&#34;和&#34;世界&#34;分别和指针增量进入其他位置以获取值。
答案 0 :(得分:3)
您正在使用sizeof (char *)
调用交换函数,因此您希望只交换指针。但是你没有将指针传递给指针,而是传递了指针本身的值。
这将使swap()
尝试在字符串中交换sizeof (char *)
个字符,这是不允许的,因为字符文字会生成无法写入的常量数据。
你应该把它称为:
swap(&s, &t, sizeof s);
只是交换指针值,而不是移动任何字符数据。
答案 1 :(得分:1)
char* s = "Hello";
char* t = "World";
两者都是指向字符串文字的指针(常量字符串)。编译器将其放在标记为只读的内存部分中。如果您尝试更改它,将导致内存访问冲突。
答案 2 :(得分:1)
传递给swap函数的指针是字符串文字,写入字符串文字中的元素是未定义的行为。这就是你得到段错误的原因