Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C代码行为奇怪(指针)_C - Fatal编程技术网

C代码行为奇怪(指针)

C代码行为奇怪(指针),c,C,我的C函数代码不断地给我错误,我不知道出了什么问题 int * myfunc(int a) { int * newNum, i; i = a*a; *newNum = i; return newNum; } 有三种类型的内存或变量,像函数中的自动、静态和手动。自动持续,范围持续。Static是指如果您使用Static声明它: static int i; 当程序处于活动状态时,它仍然存在。比如全局变量。最后是手动使用malloc和free来分配和释放内存。当然,

我的C函数代码不断地给我错误,我不知道出了什么问题

int * myfunc(int a)
{
    int * newNum, i;
    i = a*a;
    *newNum = i;
    return newNum;
}

有三种类型的内存或变量,像函数中的自动、静态和手动。自动持续,范围持续。Static是指如果您使用Static声明它:

static int i;
当程序处于活动状态时,它仍然存在。比如全局变量。最后是手动使用malloc和free来分配和释放内存。当然,您希望在返回之前将变量的地址分配给指针,如下所示:

int * newPointer = &i;
若变量是静态的,它将通过函数调用保持值。
代码通过将局部变量的地址分配给指针来避免编译器发出关于返回局部变量地址的警告,因此最好在其上运行某种工具,如Lint或Splint,下面讨论一下这类工具。看,newNum是指向整数的指针。因此,
newNum
的目的是保存任何整数的
地址

当你宣布

int * newNum;
newNum
然后指向一些垃圾

下面几行,

*newNum = i;
表示
newNum
的内容将由
i
更新。但是你忘了,
newNum
有一些垃圾地址吗?因此,
i
的值被分配了一些垃圾
位置

你可以试试这个:

/**
 * The following function will take an integer pointer from the caller. 
 * Its callers duty to check whether the pointer is initialed or not.
 */
void myfunc(int * newNum) {
    // the content of the newNum pointer points will be updated
    // as the memory address is sent here, we need not to return anything
    *newNum = (*newNum) * (*newNum);
}

int main() {
    int someInteger = 4;
    int *ptr = &someInteger;
    myfunc(ptr);
    printf("Content of the pointer: %d", *ptr);
    return 0;
}
您将得到如下输出:

指针的内容:16


newNum
需要指向某个地方……这篇文章可能会帮助你:返回悬空指针;-)myfunc返回后,自动变量i超出范围。@FilipBulovic我的眼睛一定在骗我,因为我看不到
i
的地址在哪里:sDo你的意思是return*newNum,这不会产生错误你应该详细说明上面的内容如何帮助OP.
malloc()
&friends管理动态分配的内存,也就是堆。所有命名变量都必须“手动”定义,编译器只“自动”处理临时变量。这不是“静态的”,而是具有不同链接的全局的。@奥拉夫当然,这里的问题是他在声明指针,并将局部变量的地址分配给指针,这是避免编译器发出警告的一个很好的方法
函数返回局部变量的地址
。寻找工具,将做静态分析的代码和帮助在这种情况下。我确实得到了很好的问题。然而,你应该在解释中使用适当的术语。这增加了初学者的困惑。只要使用标准中的术语,它们就被广泛接受。我不知道您的编译器,但gcc在返回指向本地的指针时会发出警告。即使没有启用警告。@Olaf仍然是新出现的,并且在你们这些人试图标准化的方式上不是很清楚。顺便说一句,我也在Linux上使用gcc,如果您直接返回地址,它会发出警告,但如果您使用额外的赋值隐藏地址,它将毫无警告,因为您需要splint。我仔细检查了一下。@高炉,我没击中目标!泰,编辑了我的答案。