c-此代码是安全的内存泄漏



我做了一个函数,这做了一次运算,在写变量之后,我的问题是:这个代码是安全的吗?

有一个例子:

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

更深入地研究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()内)实际上是未定义的行为。

问题就在这里:

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 = %pn", f);
   f = "123456";
   printf("f after re-assignment = %pn", 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: %sn", A);
   /* Don't free this */
   /* return a static string */
   B = test3();
   printf("B is now: %sn", B);
   /* allocate memory on heap and make a copy of data from a source to that memory location */
   test4(&C);
   printf("C is now: %sn", C);
   free(C);  /* only C is allocated on heap so free this one */
}

它会泄漏。

使用strcpy处理字符串

相关内容

  • 没有找到相关文章

最新更新