C 问题:将字符指针转换为交换函数的无效指针

C 问题:将字符指针转换为交换函数的无效指针,c,pointers,void-pointers,C,Pointers,Void Pointers,我正在尝试交换字符*字符串中的字符。我希望swap函数接受一个void*[]作为泛型,但我得到了一个奇怪的行为,我不知道为什么 我的主要意见是: int main(int argc, char *argv[]) { size_t n_bytes = 100; int bytes; char *my_input; int numeric = 0; my_input = (char *) malloc(n_bytes + 1); /* if -n

我正在尝试交换字符*字符串中的字符。我希望swap函数接受一个void*[]作为泛型,但我得到了一个奇怪的行为,我不知道为什么

我的主要意见是:

int main(int argc, char *argv[])
{
    size_t n_bytes = 100;
    int bytes;
    char *my_input;
    int numeric = 0;

    my_input = (char *) malloc(n_bytes + 1);

    /* if -n option is set, sort numerically versus lexicographically. */
    if (argc > 1 && strcmp(argv[1], "-n") == 0) numeric = 1;
    while(getline(&my_input, &n_bytes, stdin) && strlen(my_input) > 1)
    {
        swap((void **) my_input, 0, 2);
    }

    free(my_input);
    return 0;
}
将函数与“调试”的打印进行交换:

void交换(void*v[],int i,int j)
{
真空*温度;
printf(“i:%d j:%d\n”,i,j);
对于(int x=0;x

打印循环中出现的是用户输入的字符串的第一个字符(例如,如果input==“hello”,则打印的第一个字符将是“h”)。打印的其余字符始终是垃圾,而不是其余字符。打印保存在
v[j]
中的内容的printf打印出交换后的值,即第一个字符是什么。我猜我遗漏了一个明显的概念,但似乎无法理解它。

您已经定义了一个一维字符数组或字符*,并且正在尝试转换为vaid*[],它是一个二维数组。将void*[]替换为char*和将void*temp替换为char temp应该可以在您的程序中使用。(void*)用于传递泛型指针类型,在访问指针之前必须转换回原始类型。也只需按原样传递输入字符串,替换(void**)转换。

您正在处理的是“字符数组”,而不是“指向字符的指针数组”,对吗

void swapChar(字符*v,大小i,大小j)
{
焦炭温度;
printf(“i:%zu j:%zu\n”,i,j);
int x;
对于(x=0;x
如果要使其通用,必须告诉它元素的大小:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swap(char *v, size_t i, size_t j, size_t size)
{
    char *temp = malloc(size);
    memcpy(temp, v + i * size, size);
    memcpy(v + i * size, v + j * size, size);
    memcpy(v + j * size, temp, size);
    free(temp);
}

int main(int argc, char *argv[])
{
    char string[] = "Test string";
    swap(string, 0, 1, sizeof *string);
    puts(string);
    return 0;
}
#包括
#包括
#包括
无效交换(字符*v、大小\u t i、大小\u t j、大小\u t大小)
{
char*temp=malloc(大小);
memcpy(温度,v+i*尺寸,尺寸);
memcpy(v+i*尺寸,v+j*尺寸,尺寸);
memcpy(v+j*尺寸、温度、尺寸);
免费(临时);
}
int main(int argc,char*argv[])
{
字符字符串[]=“测试字符串”;
交换(字符串,0,1,sizeof*string);
放置(字符串);
返回0;
}
但是,通用版本无法“打印”任何内容,因为
swap()
不知道如何解释字节。例如,
0000000011111111
one
short
还是two
char
s?你还没告诉它


您还可以使用C11中的
\u Generic
宏编写脏代码。如果您的程序不必严格符合标准,您可以利用
typeof()

1。将类型不正确的数据传递到
printf
会导致未定义的行为<代码>%c
接受
int
,而不是
void*
。2.在循环中使用
strlen()
可能会导致性能下降。不同类型使用不同的内存量。除非我遗漏了一些东西,否则您如何期望swap函数知道如何交换未知大小的东西-只需使用
void*
?他们说。
void*
是一个通用指针,但
void**
不是。在编译时打开警告。
void*v[]函数参数中的
等价于
void**v
,不是数组。对。我的意思是你可以像字符串数组一样使用。e、 g.查尔**。谢谢。一定要避免造成内存泄漏!Do
free(温度)在通用版本中。使用
void*
执行算术是GCC扩展,不在标准中。
void swapChar(char *v, size_t i, size_t j)
{
    char temp;
    printf("i: %zu j: %zu\n", i, j);
    int x;
    for(x = 0; x < strlen(v); x++)
    {
        printf("%c\n", v[x]));
    }
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
    printf("first letter: %c\n", v[j]));
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swap(char *v, size_t i, size_t j, size_t size)
{
    char *temp = malloc(size);
    memcpy(temp, v + i * size, size);
    memcpy(v + i * size, v + j * size, size);
    memcpy(v + j * size, temp, size);
    free(temp);
}

int main(int argc, char *argv[])
{
    char string[] = "Test string";
    swap(string, 0, 1, sizeof *string);
    puts(string);
    return 0;
}