this question的答案描述了如何分配内存并将其返回给调用函数。给出了一个例子:
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;
}
我还想在返回调用函数之前赋值。但是,当我尝试时(例如):
void someFunction (int **data) {
*data = malloc (2 * sizeof (int));
*data[0] = 1;
*data[1] = 1;
}
void useData (int *data) {
printf ("%p", data);
}
int main () {
int *data = NULL;
someFunction (&data);
useData (data);
return 0;
}
我收到了细分错误。任何帮助表示赞赏。
答案 0 :(得分:3)
你的问题在于声明:
*data[0] = 1;
由于优先工作方式(a),这实际上相当于:
*(data[0]) = 1;
而不是像你期望的那样:
(*data)[0] = 1;
前一种变体实际上试图取消引用尚未分配的(任意)值,这是造成崩溃的原因。您应该使用后一种形式更明确。
在任何情况下,检查任何可能失败的调用总是一个好主意,以便以后不会因错误的假设而导致问题。您可能还想考虑如果将函数调用两次(或更多次)会发生什么 - 它将导致内存泄漏,因为永远不会释放旧内存。
考虑到这些要点,我会稍微修改你的功能如下:
void someFunction (int **data) {
// Release old memory if any (freeing NULL is fine).
free (*data);
// Allocate new memory and initialise only if it worked.
*data = malloc (2 * sizeof (int));
if (*data != NULL) {
(*data)[0] = 1;
(*data)[1] = 1;
}
}
(a)优先顺序取决于标准中表达类型的出现顺序。例如,C11 6.5 Expressions
表示:
语法指定运算符在表达式求值中的优先级,与本子条款的主要子条款的顺序相同,优先级最高。
而且,由于6.5.2.1
中的数据下标与6.5.3.2
中的间接比较相比,前者将首先发生
答案 1 :(得分:2)
有时,简化指针逻辑会很有帮助。
例如,在下面显示的代码中,使用更熟悉的int **
(而不是#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#define SUCCESS 0
int SomeFunction(int **OUT_data)
{
int rCode = SUCCESS;
int *data = NULL;
errno=SUCCESS;
data = malloc(2 * sizeof(int));
if(!data)
return(errno);
data[0] = 10;
data[1] = 20;
*OUT_data = data;
return(rCode);
}
void UseData(int *data)
{
printf("Data[%p]: %d, %d\n", data, data[0], data[1]);
}
int main()
{
int rCode = SUCCESS;
int *data = NULL;
rCode=SomeFunction(&data);
if(rCode)
{
fprintf(stderr, "SomeFunction() reports: %d %s\n", rCode, strerror(rCode));
return(rCode);
}
UseData(data);
return(rCode);
}
)来完成内存的分配和初始化。然后,在分配和初始化之后,分配的内存将通过{{1}}返回给调用者。
{{1}}