如何分配内存,赋值并将其返回给调用函数?

时间:2017-08-27 23:17:42

标签: c malloc

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;
}

我收到了细分错误。任何帮助表示赞赏。

2 个答案:

答案 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}}