【发布时间】:2022-01-22 10:55:01
【问题描述】:
我是教职的第一年,我有这个作业:
编写一个程序,读取 n 个字符数组并将它们连接到另一个动态分配的数组中。根据用户的需要重复该操作多次。
每次显示结果后,分配的内存都会被释放。
这就是我所做的:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
int main()
{
char** p, * v;
int n, m;
printf("\n\t enter the number of the arrays : \t");
scanf("%d", &n);
printf("\n\t enter the maximum lenght of the arrays :");
scanf("%d", &m);
p = (char**)malloc(sizeof(char) * n);
for (int i{}; i < n; i++)
p[i] = (char*)malloc(sizeof(char) * m);
char t = 'Y';
while (t == 'Y')
{
size_t z = 0;
printf("\n\t enter your arrays :");
for (int i{}; i < n; i++) {
scanf("%s", p[i]);
z += strlen(p[i]);
}
v=(char* )malloc(z * sizeof(char));
for (int i{}; i < n; i++)
if (i == 0)
strcpy(v, p[i]);
else
strcat(v, p[i]);
if (v) {
puts(v);
free(v);
}
if (p)
for (int i{}; i < n; i++)
free(p[i]);
printf("\n\t wanna continue ? (Y/N)");
scanf("%d", &t);
}
}
当我想释放内存以再次使用时,我从调试器中收到“磁头损坏错误”。
知道为什么吗?
【问题讨论】:
-
通过 valgrind 运行您的代码。如果你对内存管理不善,它会告诉你在哪里。
-
p = (char**)malloc(sizeof(char) * n);必须是p = malloc(sizeof(char *) * n);或者更好的是p = malloc(sizeof(*p) * n); -
这似乎是
C。编辑您的帖子以消除C++标签。 -
@0___________ 是的,但 OP 可能没有意识到这一点。 OP 需要弄清楚他们真正想要编码和编译的语言并首先对其进行排序。如果它是 C++ 那么很好,更新问题来说明这一点。如果是 C,则需要正确设置 IDE 才能执行此操作。
-
你已经释放了
p[i],但是你永远不会用free(p);跟进它。请记住,每次调用malloc(),都应该有一个对应的free()调用跨度>
标签: c