gpt4 book ai didi

c - 如何使用 malloc 和 free 进行动态内存分配

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:34 24 4
gpt4 key购买 nike

我刚开始学习 C,来自 php。我还不明白如何使用 malloc 和 free。

1) 在下面的示例代码中,我可以在哪里放置“免费”?

#include <stdio.h>
#include <stdlib.h>

int strLen(char* text) {
int c = 0;
for (int i = 0; text[i] != '\0'; ++i) ++c;
return c;
}


char* reverse(char* text) {

int count = strLen(text);
char* t = malloc(count);

for (int i = count; i > 0; --i) { t[count - i] = text[i-1]; }
t[count] = '\0'; /* Add end of string */

return t;

}


int main (int argc, char** argv) {

if (argc > 1) {
for (int i = 1; i < argc; ++i) {
printf("%d\t%s\t%s\n", i, argv[i], reverse(argv[i]));
}
}

return 0;
}

2) 这是 valgrind 的输出。 “大小 1 的无效写入”和“大小 1 的无效读取”错误是什么意思?

valgrind ./reverse Text ONe
==3124== Memcheck, a memory error detector
==3124== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==3124== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==3124== Command: ./reverse Text ONe
==3124==
==3124== Invalid write of size 1
==3124== at 0x40060F: reverse (in /localServer/temp/C/reverse)
==3124== by 0x400654: main (in /localServer/temp/C/reverse)
==3124== Address 0x5203044 is 0 bytes after a block of size 4 alloc'd
==3124== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3124== by 0x4005C6: reverse (in /localServer/temp/C/reverse)
==3124== by 0x400654: main (in /localServer/temp/C/reverse)
==3124==
==3124== Invalid read of size 1
==3124== at 0x4E88CC0: vfprintf (vfprintf.c:1632)
==3124== by 0x4E8F898: printf (printf.c:33)
==3124== by 0x400682: main (in /localServer/temp/C/reverse)
==3124== Address 0x5203044 is 0 bytes after a block of size 4 alloc'd
==3124== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3124== by 0x4005C6: reverse (in /localServer/temp/C/reverse)
==3124== by 0x400654: main (in /localServer/temp/C/reverse)
==3124==
1 Text txeT
2 ONe eNO
==3124==
==3124== HEAP SUMMARY:
==3124== in use at exit: 7 bytes in 2 blocks
==3124== total heap usage: 3 allocs, 1 frees, 1,031 bytes allocated
==3124==
==3124== LEAK SUMMARY:
==3124== definitely lost: 7 bytes in 2 blocks
==3124== indirectly lost: 0 bytes in 0 blocks
==3124== possibly lost: 0 bytes in 0 blocks
==3124== still reachable: 0 bytes in 0 blocks
==3124== suppressed: 0 bytes in 0 blocks
==3124== Rerun with --leak-check=full to see details of leaked memory
==3124==
==3124== For counts of detected and suppressed errors, rerun with: -v
==3124== ERROR SUMMARY: 4 errors from 2 contexts (suppressed: 0 from 0)

谢谢。

最佳答案

在使用 reverse 返回的指针之后,您应该将 free 放入循环中,如下所示。

int main (int argc, char** argv) {
char *reverseStrPtr;

if (argc > 1) {
for (int i = 1; i < argc; ++i) {
reverseStrPtr = reverse(argv[i]);
printf("%d\t%s\t%s\n", i, argv[i], reverseStrPtr);
free(reverseStrPtr);
}
}

return 0;
}

此外,valgrind 错误基于下面的行,该行位于 reverse 中。

t[count] = '\0'; /* Add end of string */

简单地说,当你分配count-many字节时,你的索引范围是[0, count)。所以尝试访问 count 等同于访问第 (count+1) 位,这是访问冲突。

您需要更正的是您分配的内存量,即(count+1) 字节。需要额外的字节来放置终止 '\0' 字符。

char* reverse(char* text) {
int count = strLen(text);
char* t = malloc(count+1); // +1 for the terminating '\0'

for (int i = count; i > 0; --i) { t[count - i] = text[i-1];}
t[count] = '\0'; /* Add end of string */

return t;
}

关于c - 如何使用 malloc 和 free 进行动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42113463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com