我做了一个函数,这做了一次运算,在写变量之后,我的问题是:这个代码是安全的吗?
有一个例子:
#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
处理字符串