c - c 中传递指针警告

标签 c pointers warnings pass-by-reference

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

int foo(int **asciiSum);

int main(void)
{
     int asciiSum;
     asciiSum = 0;

     int* pointToAsciiSum;
     *pointToAsciiSum = &asciiSum;

     printf("%d\n",*pointToAsciiSum); //prints 0
     foo(pointToAsciiSum)
     printf("%d\n",*pointToAsciiSum); //prints 2

     return 0;
}
int foo(int** asciiSum)
{
    *asciiSum = 2;
    return 0;
}

如何消除警告?

警告:

警告 C4047: 'function' : 'int **' 与 'int *' 的间接级别不同//在调用 foo 时发生

警告 C4024: 'foo' : 形参 1 和实参 1 的类型不同//在调用 foo 时发生

警告 C4047: '=' : 'int *' 与 'int' 的间接级别不同//在将 2 分配给 *asciiSum 时出现在 foo 中

最佳答案

 int* pointToAsciiSum;
 *pointToAsciiSum = &asciiSum;

应该是

 int* pointToAsciiSum;
 pointToAsciiSum = &asciiSum;

您想要分配给指针,而不是分配给(未初始化的)指针指向的 int

<小时/>
int foo(int** asciiSum) { 
    *asciiSum = 2;

应该是

int foo(int* pointToAsciiSum) { 
    *pointToAsciiSum = 2;

让我们使用一致的名称。不过,主要问题是子进程需要一个指向指针的指针,但没有必要这样做。您想要更改 int,因此您只需要一个指向该 int 的指针。

<小时/>

全部放在一起,没有所有额外的指针:

#include <stdio.h>

void foo(int* num_ptr) {
   *num_ptr = 2;
}

int main(void) {
     int num = 0;
     printf("%d\n", num);

     foo(&num);
     printf("%d\n", num);

     return 0;
}

关于c - c 中传递指针警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42077067/

相关文章:

delphi - SerAndDeser.pas(298) : W1036 Variable 'tForm' might not have been initialized

c - 在 C 中运行时评估 switch 表达式

c - 结构数组和 malloc [C]

python - 有什么方法可以使用 Numpy 数组创建软引用或类似指针的对象吗?

c - Valgrind 陷入无限循环

visual-studio-2012 - Visual Studio 2012 未记录警告 C4447

c - 函数 strlen 中的警告 - 在 C 中

c - 使用scanf读取字符

c - 为什么 puts 在以下代码中不起作用?

c - 搜索二叉搜索树的最有效方法是什么?