为什么在 C 中调用 free 时会出现 3221226356 错误?
Why do I get 3221226356 error when calling free in C?
我正在学习 C 并完成一些编码挑战来学习。
在进行 1 项挑战时,我需要创建一个动态二维字符数组。
我正在尝试按照其他一些 Whosebug 答案动态创建二维数组。
我可以创建它,但在尝试释放内存时,我收到错误 3221226356。
下面是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n;
scanf("%d", &n);
char **s = malloc(n * sizeof(char *));
for (int i = 0; i < n; i++)
{
s[i] = malloc(1000 * sizeof(char));
//memset(s[i], '[=10=]', 1000);
scanf("%s", &s[i]);
}
for (int i = 0; i < n; i++)
{
printf("%s - %d\n", &s[i], strlen(&s[i]));
}
for (int i = 0; i < n; i++)
{
printf("Freeing %d\n", i);
//char *tmp = &s[i];
free(s[i]);
}
printf("Freeing s\n");
free(s);
if (argc > 1)
{
char xx[100];
scanf("%s", xx);
}
return EXIT_SUCCESS;
}
以及输出代码的示例 运行:
2
xx
sss
xx - 2
sss - 3
Freeing 0
[process exited with code 3221226356]
我试过在 &s[i] 和 *s[i] 上调用 free 但都导致错误。
我的编译器是 GCC。
我做错了什么?
所以关于 &s[i] 的评论让我找到了一种显而易见的解决方案。
为 scanf 创建临时变量。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n;
scanf("%d", &n);
char **s = malloc(n * sizeof(char *));
for (int i = 0; i < n; i++)
{
//s[i] = malloc(1000 * sizeof(char));
char *tmp = malloc(sizeof(char));
//memset(s[i], '[=10=]', 1000);
scanf("%s", tmp);
s[i] = tmp;
}
for (int i = 0; i < n; i++)
{
printf("%s - %d\n", s[i], strlen(s[i]));
}
for (int i = 0; i < n; i++)
{
printf("Freeing %d\n", i);
//char *tmp = &s[i];
free(s[i]);
}
printf("Freeing s\n");
free(s);
if (argc > 1)
{
char xx[100];
scanf("%s", xx);
}
return EXIT_SUCCESS;
}
我正在学习 C 并完成一些编码挑战来学习。
在进行 1 项挑战时,我需要创建一个动态二维字符数组。
我正在尝试按照其他一些 Whosebug 答案动态创建二维数组。
我可以创建它,但在尝试释放内存时,我收到错误 3221226356。
下面是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n;
scanf("%d", &n);
char **s = malloc(n * sizeof(char *));
for (int i = 0; i < n; i++)
{
s[i] = malloc(1000 * sizeof(char));
//memset(s[i], '[=10=]', 1000);
scanf("%s", &s[i]);
}
for (int i = 0; i < n; i++)
{
printf("%s - %d\n", &s[i], strlen(&s[i]));
}
for (int i = 0; i < n; i++)
{
printf("Freeing %d\n", i);
//char *tmp = &s[i];
free(s[i]);
}
printf("Freeing s\n");
free(s);
if (argc > 1)
{
char xx[100];
scanf("%s", xx);
}
return EXIT_SUCCESS;
}
以及输出代码的示例 运行:
2
xx
sss
xx - 2
sss - 3
Freeing 0
[process exited with code 3221226356]
我试过在 &s[i] 和 *s[i] 上调用 free 但都导致错误。
我的编译器是 GCC。
我做错了什么?
所以关于 &s[i] 的评论让我找到了一种显而易见的解决方案。
为 scanf 创建临时变量。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n;
scanf("%d", &n);
char **s = malloc(n * sizeof(char *));
for (int i = 0; i < n; i++)
{
//s[i] = malloc(1000 * sizeof(char));
char *tmp = malloc(sizeof(char));
//memset(s[i], '[=10=]', 1000);
scanf("%s", tmp);
s[i] = tmp;
}
for (int i = 0; i < n; i++)
{
printf("%s - %d\n", s[i], strlen(s[i]));
}
for (int i = 0; i < n; i++)
{
printf("Freeing %d\n", i);
//char *tmp = &s[i];
free(s[i]);
}
printf("Freeing s\n");
free(s);
if (argc > 1)
{
char xx[100];
scanf("%s", xx);
}
return EXIT_SUCCESS;
}