【问题标题】:Passing by pointer warnings in c在c中传递指针警告
【发布时间】:2017-02-06 20:52:19
【问题描述】:
#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 的不同类型 // 调用 foo 时发生

警告 C4047: '=' : 'int *' 在间接级别上与 'int' 不同 //发生在 foo 中,当将 2 分配给 *asciiSum 时

【问题讨论】:

  • 在不确定时使用具有自动存储持续时间的对象的值的未定义行为。
  • @EOF 你的解释不适用。
  • @BLUEPIXY 见鬼:int* pointToAsciiSum; *pointToAsciiSum = &amp;asciiSum; 在不确定时使用指针(这是一个具有自动存储持续时间的对象)。想想如果是的话,也是违反了约束,这就引出了对应的编译器警告在哪里的问题。
  • *pointToAsciiSum = &amp;asciiSum; --> pointToAsciiSum = &amp;asciiSum;, foo(pointToAsciiSum) --> foo(&amp;pointToAsciiSum);, *asciiSum = 2; --> **asciiSum = 2;

标签: c pointers warnings pass-by-reference


【解决方案1】:
 int* pointToAsciiSum;
 *pointToAsciiSum = &asciiSum;

应该是

 int* pointToAsciiSum;
 pointToAsciiSum = &asciiSum;

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


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

应该是

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

让我们使用一致的名称。但是,主要问题是 sub 需要一个指向指针的指针,但没有必要这样做。你想改变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;
}

【讨论】:

  • 哇,为什么大多数关于指针的教程都过于混乱了?这种格式更有意义,谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-01-03
  • 2018-12-16
  • 2020-08-16
  • 2016-02-06
  • 2012-12-29
  • 2011-01-10
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多