今年我要学习数据结构类(class),所以我决定通过做一些关于 C 中指针的简单任务来更新我对 C 的知识,并且我注意到关于将指针传递给函数的一件事,我可以'不太明白。
假设我们有一个函数:
void assignValueTen(int *var){
*var=10;
}
我们可以像这样从 main 调用这个函数:
int main( void ){
int x;
assignValueTen(&x);
printf("The value of x is %d.\n",x);
return 0;
}
其输出将是:
The value of x is 10.
我们也可以这样调用这个函数:
int main( void ){
int x, *y;
y=&x;
assignValueTen(y);
printf("The value of x is %d.\n",x);
return 0;
}
其输出也将是:
The value of x is 10.
但是,下面的语句不能按预期工作:
int main( void ){
int *x;
assignValueTen(x);
printf("The value of x is %d.\n",*x);
return 0;
}
上面代码的输出是:
Process exited after 6.723 seconds with return value 3221225477
那么,为什么代码可以编译但没有按预期工作?
是不是因为上一个例子中指针之前还没有分配到任何地址?
有人可以更详细地解释为什么会发生这种情况吗?
非常感谢!
最佳答案
不起作用的是因为 x 没有被分配任何特定的值。函数中的赋值是在未初始化的变量恰好指向的地方进行赋值,并且该地址不太可能是有效地址(如硬件所见),即使它是有效的(再次根据硬件),它也不在您< em>应该写入(因为该地址“属于”除您在 main 中运行的代码之外的其他内容)。
您应该只访问您有理由知道有效的地址(您的 allocateValueTen 函数具有诸如隐式要求),尽管其他一些语言可以,但 C 确实没有办法强制执行此类要求契约(Contract)。
关于c - 将指针传递给 C 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52683595/