a_m*_*m0d 32 c malloc pointers
我在一些不同的函数中有一些代码看起来像这样:
void someFunction (int *data) {
data = (int *) malloc (sizeof (data));
}
void useData (int *data) {
printf ("%p", data);
}
int main () {
int *data = NULL;
someFunction (data);
useData (data);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
someFunction ()
并useData ()
在单独的模块(*.c文件)中定义.
问题是,虽然malloc工作正常,并且分配的内存可用someFunction
,但一旦函数返回,相同的内存就不可用.
这里可以看到程序的示例运行,输出显示各种存储器地址.
有人可以向我解释我在这里做错了什么,以及如何让这段代码工作?
编辑:所以似乎我需要使用双指针来做这个 - 当我真的需要使用双指针时,我将如何做同样的事情?所以例如数据就是
int **data = NULL; //used for 2D array
Run Code Online (Sandbox Code Playgroud)
那么我是否需要在函数调用中使用三指针?
Mar*_*n B 61
你想使用指针指针:
void someFunction (int **data) {
*data = malloc (sizeof (int));
}
void useData (int *data) {
printf ("%p", data);
}
int main () {
int *data = NULL;
someFunction (&data);
useData (data);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么?好吧,你想data
在主函数中改变你的指针.在C中,如果您想要更改作为参数传入的内容(并且在调用者的版本中显示该更改),则必须传入指向您想要更改的内容的指针.在这种情况下,"你想要改变的东西"是一个指针 - 所以为了能够改变那个指针,你必须使用一个指针到指针......
请注意,除了主要问题之外,代码中还有另一个错误:sizeof(data)
为您提供存储指针所需的字节数(32位操作系统上4个字节或64位操作系统上8个字节),而您确实需要存储指针所指向的字节数(一个int
,即大多数操作系统上的4个字节).因为通常情况下sizeof(int *)>=sizeof(int)
,这可能不会引起问题,但需要注意的是.我在上面的代码中已经纠正了这一点.
以下是关于指针指针的一些有用的问题:
一个常见的陷阱,特别是如果您将Java从C/C++转移到C/C++
记住,当你传递一个指针时,它会传递值,即复制指针的值.对指针指向的数据进行更改是有好处的,但指针本身的任何更改都只是本地的,因为它是一个副本!!
诀窍是使用通过引用传递指针,因为你想要改变它,即malloc它等.
**指针 - >会吓到一个noobie C程序员;)
如果要修改指针,则必须将指针传递给指针。
IE。:
void someFunction (int **data) {
*data = malloc (sizeof (int)*ARRAY_SIZE);
}
Run Code Online (Sandbox Code Playgroud)
编辑:添加了 ARRAY_SIZE,在某些时候您必须知道要分配多少个整数。