这段代码是安全的内存泄漏?

时间:2014-10-11 18:28:24

标签: c memory-leaks malloc

我创建了一个函数,这个做了一个操作,在写完变量之后,我的问题是: 这段代码安全吗?

有一个样本:

#include <stdlib.h>

void test(char **out){
    char *f = (char *) malloc(10);
    f = "123456";
    *out = f;
    return;
}

int main(void){
    char *A = NULL;
    test(&A);
    free(A);
    return;
}

3 个答案:

答案 0 :(得分:1)

仔细研究test()定义:

void test(char **out){
    char *f = (char *) malloc(10);
    f = "123456";
    *out = f;
    return;
}

特别是那两行:

char *f = (char *) malloc(10);
f = "123456";

这段代码正在做的只是用指向字符串文字的指针替换malloc-ed指针,因为你的程序中有内存泄漏(也就是说,你丢失了从malloc()调用获得的原始指针),此外,在这种情况下调用free()(在main()内)实际上是未定义的行为。

答案 1 :(得分:0)

泄漏。

使用strcpy来处理字符串

答案 2 :(得分:0)

问题在于:

void test(char **out){
    char *f = (char *) malloc(10);
    f = "123456";
    *out = f;
    return;
}

malloc行在堆上分配10个字节的内存。所以在这个阶段,f的地址将是malloc碰巧抓住一大块内存的地方。为了论证,我们会说这是在0x10000

然后为f指定文字字符串的地址。

下面的代码打印出正在发生的事情。

#include <stdlib.h>

void test(char **out){
   char *f = (char *) malloc(10);
   printf("f after malloc = %p\n", f);
   f = "123456";
   printf("f after re-assignment = %p\n", f);
   *out = f;
   return;
}

int main(void){
   char *A = NULL;
   test(&A);
   free(A);
   return;
}

以下是在C中使用字符串的一些替代方法。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

static  char* b = "test 2"; 

void test2(char **out){
   *out = b;
}

const char* test3(){
   return "test 3";
}

void test4(char **out){
   *out = (char *) malloc(10);
   strcpy(*out, "test 4");
}

int main(void){
   char *A = NULL;
   char *B = NULL;
   char *C = NULL;

   /* Assign A to the address of a 'global' string */
   test2(&A);
   printf("A is now: %s\n", A);
   /* Don't free this */

   /* return a static string */
   B = test3();
   printf("B is now: %s\n", B);

   /* allocate memory on heap and make a copy of data from a source to that memory location */
   test4(&C);
   printf("C is now: %s\n", C);
   free(C);  /* only C is allocated on heap so free this one */
}