我在使用DES算法的结构:

typedef struct {
    int size;
    int capacity;
    unsigned char *block;
}Blocks64;

我已经做了很多事情,所以我有一些关于无符号字符的信息。我在一个我称之为迭代的函数中,我需要通过参数来发送它,这样我就可以在函数中修改它,而更改就停留在结构上,所以据我所知,这是实现它的方法:
void iterations(Block64 *blocks){
   printf("This is the first char: %c",get_64bBlocks_char(&blocks,0,0));
}

在方法内部,我有一个printf();以便我可以检查它是否与我发送的那个相同。。。但事实并非如此。在我调用迭代的函数上,我有相同的代码:
printf("This is the first char: %c",get_64bBlocks_char(&blocks,0,0));

它打印了我在其中存储的内容,但在迭代方法中却没有。
所以我只是测试一下:
void iterations(Block64 blocks){
   printf("This is the first char: %c",get_64bBlocks_char(&blocks,0,0));
}

现在我收到的是正确的!如果我在迭代方法内部进行了更改,它将影响方法外部的更改。我真的不明白!据我所知,我必须使用指向结构的指针,以便通过引用传递它。我现在的编译器是Visual Studio 2015。

最佳答案

因为您传递的是指针的地址,而不是struct的地址,所以只需删除第一个版本中的&

void iterations(Block64 *blocks)
{
   printf("This is the first char: %c", get_64bBlocks_char(blocks, 0, 0));
}

因为您传递的是一个指针,所以不需要获取它的地址就可以将其传递回get_64bBlocks_char()
如果启用了编译器警告,则编译器将告诉您get_64bBlock_char()的第一个参数是不兼容的类型,因为它将是带有Block64 **运算符的&
第二种情况是,不会按您所希望的那样工作,因为函数将处理结构的副本,因此,在函数返回后,对它所做的更改不会被保留,因为副本被释放,而且还因为您需要它处理必须传递其地址才能对其进行修改的原始文件。

09-10 14:28
查看更多