提问人:Quintonn 提问时间:12/14/2020 更新时间:12/16/2020 访问量:155
为什么在 C 中调用 free 时会出现3221226356错误?
Why do I get 3221226356 error when calling free in C?
问:
我正在学习 C 语言并做一些编码挑战来学习。
在进行 1 个挑战时,我需要创建一个动态的 2D 字符数组。
我正在尝试遵循其他一些 StackOverflow 答案来动态创建 2D 数组。
我能够创建它,但是在尝试释放内存时,我收到错误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], '\0', 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],但两者都会导致错误。
我的编译器是GCC。
我做错了什么?
答:
0赞
Quintonn
12/16/2020
#1
因此,对 &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], '\0', 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;
}
评论
malloc
free
scanf
&s[i]
s[i]
%s
%[
-Wall
&s[i]
s[i]
&s[i]
char **
scanf
printf
s[i]
char *
scanf('%s",&s[i][index]
scanf("%s",s[i])
scanf("%s",&s[i][0]
scanf("%s", &s[i]); ... printf("%s - %d\n", &s[i], strlen(&s[i]));