Arrays C-在2D数组之后释放内存

Arrays C-在2D数组之后释放内存,arrays,c,free,Arrays,C,Free,我有个问题。我创建了一个二维数组,最后,我想释放它。我的代码中哪里有问题? 如果我运行我的程序,一切正常,直到结束。它永远不会打印成功!,所以我认为在那之前它就已经过时了。有什么帮助吗? 这是我的密码: #include<stdio.h> #include<stdlib.h> int main() { int n=5; int size=51; char **a_name=(char**)malloc(sizeof(char*)*n);

我有个问题。我创建了一个二维数组,最后,我想释放它。我的代码中哪里有问题? 如果我运行我的程序,一切正常,直到结束。它永远不会打印成功!,所以我认为在那之前它就已经过时了。有什么帮助吗? 这是我的密码:

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

int main()
{
    int n=5;
    int size=51;
    char **a_name=(char**)malloc(sizeof(char*)*n);
    for(int i=0;i<n;i++){
        a_name[i]=(char*)malloc(sizeof(char)*size);
        scanf("%s",a_name[i]);
    }
    for(int i=0;i<n;i++){
        printf("%s\n",a_name[i]);
    }
    n=6;
    *a_name=realloc(*a_name,sizeof(char*)*n);
    scanf("%s",a_name[n-1]);
    printf("\n");
    for(int i=0;i<n;i++){
        printf("%s\n",a_name[i]);
    }
    for(int i=0;i<n;i++){
        free(a_name[i]);
    }
    free(a_name);
    printf("Succes!\n");
    return 0;
}
#包括
#包括
int main()
{
int n=5;
int size=51;
char**a_name=(char**)malloc(sizeof(char*)*n);
对于(inti=0;i首先,改变

*a_name = realloc(*a_name, sizeof(char*) * n);

您不希望将字符串数组(
a_名称
)的内容重新分配到其中一个字符串本身(
*a_名称

其次,问题的根源是,在调用realloc之后,您没有像在这里那样对新添加的
a_name
元素调用malloc:

for(int i=0;i<n;i++) {
    a_name[i] = (char*)malloc(sizeof(char) * size); // here you allocated a 51 byte block for each char*
    scanf("%s", a_name[i]);
}
您的最终代码应该如下所示

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

int main()
{
    int n = 5;
    int size = 51;

    char **a_name = (char**)malloc(sizeof(char*)*n); 
    
    for (int i = 0; i < n; i++) {
        a_name[i] = (char*)malloc(sizeof(char)*size);
        scanf("%s", a_name[i]);
    }
    
    for (int i = 0; i < n; i++) {
        printf("%s\n", a_name[i]);
    }

    n = 6;
    a_name = (char**)realloc(a_name, sizeof(char*) * n);
    a_name[n - 1] = (char*)malloc(sizeof(char) * size); // allocate memory for the string first
    scanf("%s", a_name[n - 1]);
    printf("\n");
    for (int i = 0; i < n; i++) {
        printf("%s\n", a_name[i]);
    }
    for (int i = 0; i < n; i++) {
        free(a_name[i]);
    }
    free(a_name);
    printf("Success!\n");
    return 0;
}
#包括
#包括
int main()
{
int n=5;
int size=51;
char**a_name=(char**)malloc(sizeof(char*)*n);
对于(int i=0;i
*a_name=realloc(*a_name
删除那些
*
最后一个元素从未分配。您需要a_name[n-1]=(char*)malloc(sizeof(char)*size)
char**a_name
读取为指向char的指针。Realloc接受指针。因此,您传递
a_name
。额外的*是取消对它的引用并传递指向char的指针。请省去我们查看屏幕截图的麻烦。将输出文本直接粘贴到问题中。该屏幕中的数千像素他们并没有做任何事情来帮助理解这个问题,他们只是混淆了底部的输出,应该以文本形式保存。
a_name[n - 1] = (char*)malloc(sizeof(char) * size);
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int n = 5;
    int size = 51;

    char **a_name = (char**)malloc(sizeof(char*)*n); 
    
    for (int i = 0; i < n; i++) {
        a_name[i] = (char*)malloc(sizeof(char)*size);
        scanf("%s", a_name[i]);
    }
    
    for (int i = 0; i < n; i++) {
        printf("%s\n", a_name[i]);
    }

    n = 6;
    a_name = (char**)realloc(a_name, sizeof(char*) * n);
    a_name[n - 1] = (char*)malloc(sizeof(char) * size); // allocate memory for the string first
    scanf("%s", a_name[n - 1]);
    printf("\n");
    for (int i = 0; i < n; i++) {
        printf("%s\n", a_name[i]);
    }
    for (int i = 0; i < n; i++) {
        free(a_name[i]);
    }
    free(a_name);
    printf("Success!\n");
    return 0;
}