C语言函数返回指针:堆内存分配与局部变量的陷阱
在C语言中,可以使用malloc函数在堆上分配内存,然后返回指向该内存的指针。
#include <stdlib.h>
int* allocate_int_on_heap(int value) {
int* ptr = malloc(sizeof(int));
*ptr = value;
return ptr;
}
在该函数中,使用malloc函数分配了一个int类型的内存空间,并将传入的值存储在该空间中,然后返回指向该空间的指针。调用该函数的代码如下:
int* ptr = allocate_int_on_heap(42);
printf('%d\n', *ptr);
free(ptr);
在上述代码中,我们通过调用allocate_int_on_heap函数,在堆上分配了一个int类型的内存空间,并将值42存储在其中。然后,我们打印了该空间中存储的值,并使用free函数释放了该空间,以避免内存泄漏。
为什么不能直接返回局部变量的指针?
不能直接返回局部变量的指针是因为局部变量的生命周期仅限于函数的执行期间。当函数返回时,这些变量的内存空间将被释放,并且该指针将成为悬挂指针,指向已经释放的内存空间,这可能导致程序崩溃或产生不可预测的行为。
以下是一个错误的示例,试图返回指向局部变量的指针:
int* return_local_pointer() {
int value = 42;
return &value; // 错误!返回指向局部变量的指针
}
在上述代码中,我们试图返回指向局部变量value的指针。但是,当函数返回时,该变量的内存空间将被释放,指针将成为悬挂指针。
完整可运行的示例
以下是几个完整的可以运行的例子:
// 返回指向堆上分配的字符串的指针
#include <stdlib.h>
#include <string.h>
char* allocate_string_on_heap(const char* str) {
char* ptr = malloc(strlen(str) + 1);
strcpy(ptr, str);
return ptr;
}
int main() {
char* ptr = allocate_string_on_heap('Hello, world!');
printf('%s\n', ptr);
free(ptr);
return 0;
}
// 返回指向堆上分配的数组的指针
#include <stdlib.h>
int* allocate_array_on_heap(int size) {
int* ptr = malloc(size * sizeof(int));
for (int i = 0; i < size; i++) {
ptr[i] = i + 1;
}
return ptr;
}
int main() {
int* ptr = allocate_array_on_heap(5);
for (int i = 0; i < 5; i++) {
printf('%d ', ptr[i]);
}
printf('\n');
free(ptr);
return 0;
}
原文地址: https://www.cveoy.top/t/topic/n3lW 著作权归作者所有。请勿转载和采集!