使用字符串的通用指针

时间:2014-06-30 10:48:40

标签: c

我正在尝试一个示例程序来了解通用交换函数。

/ *一个简单的通用交换函数* /

#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;分别和指针增量进入其他位置以获取值。

3 个答案:

答案 0 :(得分:3)

您正在使用sizeof (char *)调用交换函数,因此您希望只交换指针。但是你没有将指针传递给指针,而是传递了指针本身的值。

这将使swap()尝试在字符串中交换sizeof (char *) 个字符,这是不允许的,因为字符文字会生成无法写入的常量数据。

你应该把它称为:

swap(&s, &t, sizeof s);

只是交换指针值,而不是移动任何字符数据。

答案 1 :(得分:1)

  char* s = "Hello";
  char* t = "World";

两者都是指向字符串文字的指针(常量字符串)。编译器将其放在标记为只读的内存部分中。如果您尝试更改它,将导致内存访问冲突。

答案 2 :(得分:1)

传递给swap函数的指针是字符串文字,写入字符串文字中的元素是未定义的行为。这就是你得到段错误的原因