[英]Using malloc like this is correct?
我是動態內存分配的新手。 這種類型的使用是否會造成任何內存泄漏或未分配的內存訪問?
char *func2(char *str) {
//Do something like writing 10 characters to str
return str;
}
void func1() {
char *str = NULL, *res;
int len = 10;
str = (char *)malloc(len * sizeof(char));
res = func2(str);
free(str);
printf("%s", res);
}
是否在最后的printf語句func1
導致分段錯誤的str
已被釋放,將res
是一個懸擺指針,無記憶位置點?
res
在其引用的內存被釋放后使用。 這是未定義的行為,可能會也可能不會導致運行時錯誤。 畢竟,未定義的行為是未定義的。
在實踐中,我認為可能發生的是,您的程序將很樂意打印內存res
中的任何內容。 記憶沒有消失,你剛才說你不再使用它了。 在那段記憶中將會是未初始化的垃圾,因為你從來沒有寫過任何東西。 我想你會得到gobbledygook輸出。
是的,這是一個錯誤。 我們可以通過將代碼轉換為工作示例並在Valgrind下運行它來演示錯誤:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *func2(char *str)
{
strcpy(str, "hello!");
return str;
}
int main()
{
char *str, *res;
int len = 10;
str = malloc(len);
res = func2(str);
free(str);
printf("%s", res);
}
輸出顯示了發生的事情:
gcc -std=c11 -fPIC -g -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds 44704791.c -o 44704791
valgrind --leak-check=full ./44704791
==12624== Memcheck, a memory error detector
==12624== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==12624== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==12624== Command: ./44704791
==12624==
==12624== Invalid read of size 1
==12624== at 0x4C2EDA2: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==12624== by 0x4E80D77: vfprintf (vfprintf.c:1637)
==12624== by 0x4E871F8: printf (printf.c:33)
==12624== by 0x1087B5: main (44704791.c:18)
==12624== Address 0x51d7040 is 0 bytes inside a block of size 10 free'd
==12624== at 0x4C2CDDB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==12624== by 0x10879D: main (44704791.c:17)
==12624== Block was alloc'd at
==12624== at 0x4C2BBAF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==12624== by 0x10877D: main (44704791.c:15)
它向我們顯示第18行的printf
試圖從第17行釋放的內存中讀取。此外,它顯示有問題的內存是在第15行分配的。
這個故事的寓意是你應該在你完成使用它之后釋放內存(而不是之前),如果你不清楚你的函數是否取得了指針中傳遞給它們的內存的所有權,那么這很難做到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.