我创建了一个函数,这个做了一个操作,在写完变量之后,我的问题是: 这段代码安全吗?
有一个样本:
#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;
}
答案 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 */
}