1

以下代码是否可以接受。也就是说,这是做 malloc 的正确方法吗?

这是我可以为我的情况工作的最少代码。我认为这是“正确的方法”,但我对 C 语言非常陌生,总体上没有太多线索。我阅读了几篇相关的 SO 帖子,但似乎没有一个完全符合这种情况。评论?

#include <stdio.h>

// example of calling a function that creates a dynamically sized array and
// returns it to a caller that doesn't know or care about the size of the array

char* return_char_array(){
     // for the sake of the example, we determined the size to be 100
     char *f=malloc(100*sizeof(char));
     // stick something in the first couple of elements for test purposes
     *f=65;
     *(f+1)=66;
     return f;
}

int main(){
    // we want this function to remain ignorant of the size or other workings 
    // of the array, so, no '[]' or 'malloc'
    char *wipc = return_char_array();
    // well i guess it cares a little, because we assume there are at least 2 elements...
    printf("%c,%c\n",*(wipc),*(wipc+1));
    system("PAUSE");
    return 0;
}
4

7 回答 7

4

评论?

使用f[0]代替*ff[1]代替*(f + 1)。也一样wipc。别忘了打电话free

于 2012-07-04T14:33:06.207 回答
1

我认为在这种情况下还可以。但请记住释放分配的内存:)

于 2012-07-04T14:35:49.983 回答
0

任何函数不知道它正在使用的数组的大小都没有任何优势。评论需要解释。

于 2012-07-04T14:33:13.347 回答
0

乍一看,我承认你没有释放()你的分配空间,这很糟糕(内存泄漏)。那是我能看到的唯一真正的“错误”。但是,如果您想以 Code-Review 的形式获得更多见解,您可以将其发布在 Stackexchange 站点“Code-Review”上,因为该站点更多地用于解决实际问题和错误。

于 2012-07-04T14:36:14.700 回答
0

好吧,它确实是最少的代码。我宁愿将额外的标记字节放在缓冲区的末尾,并记住在 malloc 时将额外的 2 个字节添加到缓冲区长度

这 2 个字节保留供内部使用,不应向用户公开。

于 2012-07-04T14:37:57.923 回答
0

不,这是一个坏主意,没有多大意义。分配内存的代码需要负责释放它,否则您将有很大的内存泄漏可能性。

通常你会写这样的算法:

// caller.c

#include "stuff.h"  // the code uses the code module "stuff"

void caller (void)
{
  int* array = malloc(N * sizeof(int));

  do_stuff(array, N);

  free(array);
}

_

// stuff.h

void do_stuff (int* array, int size);

_

// stuff.c

#include "stuff.h"

void do_stuff (int* array, int size)
{
  ...
}

通过这个程序设计,“do_stuff()”不需要关心内存分配,它只是执行它的算法。也不必担心内存泄漏,因为分配和释放是在同一个地方完成的。

此外,通过这种设计,do_stuff() 将与静态分配的内存(简单数组)一样工作。

这种设计几乎是 C 语言中的标准。整个 Windows API 都使用这种设计作为一个例子。

于 2012-07-04T14:43:13.437 回答
0

几点评论,

1)PL。进行适当的错误处理。如果 malloc 失败会发生什么?

char *f=malloc(100*sizeof(char))
if (NULL == f)
{   
   //Take actions ..Exit with error or return NULL..
}

2)PL。避免像 100 这样的硬编码值(可能有 #define MAX 100)

3)PL。确保正确释放内存。

于 2012-07-04T14:50:36.797 回答