c - 使用 void 指针的通用复制

标签 c pointers segmentation-fault void

我实现了一个通用的快速排序,现在我想从命令行接受数组。以下是一个函数,它应该将字符指针从数组 argv 复制到 base。我遇到段错误。当我传递两个整数的地址时,副本工作正常。

#include<stdio.h>

void copy(void *src, void *dest, int size)
{
    char *s, *d;
    int i;

    s = src;
    d = dest;

    for(i = 0; i < size; i++)
        d[i] = s[i];
}

int main(int argc, char *argv[])
{
    void *base;
    int i = 10;
    int j = 20;

    printf("%d, %d\n", i, j);
    copy(&i, &j, sizeof(int));
    printf("%d, %d\n", i, j);

    copy(argv, base, sizeof(char *));

    return 0;
}

输出

10, 20
10, 10
Segmentation fault (core dumped)

最佳答案

argv 是一个指针数组。如果你只想复制指针,你可以这样做:

 base = calloc( argc, sizeof(char *) );
 copy( argv, base, argc * sizeof(char *) );

现在您有了指针数组 argv 的副本,但它仍然包含指向原始参数 argv[i] 的指针。 如果你也想创建 argv[i] 的副本,请不要使用 copy() 但是:

 char **base = calloc( argc, sizeof(char *) );
 int  i;

 for( i=0; i<argc; i++ )
     base[i] = strdup( argv[i] );

但请记住:argv[0] 是程序的名称,我敢打赌您不希望它成为数组的一部分。为了避免它:

 base = calloc( argc-1, sizeof(char *) );
 copy( argv+1, base, (argc-1) * sizeof(char *) );

 char **base = calloc( argc, sizeof(char *) );
 int  i;

 for( i=1; i<argc; i++ )
     base[i-1] = strdup( argv[i] );

关于c - 使用 void 指针的通用复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18896899/

相关文章:

c++ - Opencv:用 imwrite 保存双矩阵

c - 在另一个.c中引用队列

c++ - 是否有不关心结构/类布局的编译指示?如果不是,为什么?

c++ - 队列实现正在失去对头节点的跟踪

java - 使用 SWIG 制作 java 共享库时出现 SIGSEGV 错误

c - 为什么 C_GenerateKeyPair 返回错误 (PKCS#11)?

C++ 函数调用后无关指针发生变化

c - 声明指向从结构定义中接受结构的函数的指针?

c - (另一个)关于 C 循环和数据结构的问题

c++ - 函数中 return 语句的段错误