我实现了一个通用的快速排序,现在我想从命令行接受数组。以下是一个函数,它应该将字符指针从数组 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/