gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:53:10 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com