免费的2D动态阵列内部的链接列表中

发布于 2025-01-23 16:37:41 字数 3052 浏览 4 评论 0原文

我的问题是释放动态2D数组,

typedef struct name{
    char **given_name;
    char **surname;
} Name;

typedef struct list {
    float id;
    struct name author_name;
    struct list *p_prev, *p_next;
} List;

void load_data(List** head){
     List* tmp_new = Null;
     while(1){
          tmp_new->author_name.given_name= (char**) malloc(10 * sizeof(char*));
          tmp_new->author_name.surname   = (char**) malloc(10 * sizeof(char*));
          while(condition){ //this condition is always whithin 1-10
               tmp_new->author_name.given_name[i]=(char*) malloc(200 * sizeof(char*));
               tmp_new->author_name.surname[i]   =(char*) malloc(200 * sizeof(char*));
         }
          given_name= "John"
          surname= "Blake"
          sscanf(name, "%s %s", tmp_new->author_name.given_name[i], tmp_new->author_name.surname[i]);
  
          tmp_new->p_prev = *head;
          tmp_new->p_next = NULL;
          (*head)->p_next = p_new;
          (*head) = p_new;

          // realloc again for the next enrty
         
           given_name= "Tom"
           surname= "Jerry"
          sscanf(name, "%s %s", tmp_new->author_name.given_name[i],tmp_new->author_name.surname[i]);
      }
     }
//once done within this function free it
if(*head != NULL) {
            while (1){
                if ((*head)->p_next!= NULL) {
                    tmp = (*head);
                    (*head) = (*head)->p_next;
                    for(int i=0; i<200; i++){
                            free(tmp->author_name.given_name[i]);
                            free(tmp->author_name.surname[i]);
                            }
                    free(tmp->author_name.given_name);
                    free(tmp->author_name.surname);
                    free(tmp);
                    }
                else {
                    break;
                }
            }
        }
}
int main()
    List* head = NULL;
    List* tmp;


    load_data(&head);
    if (head != NULL) {
        while (1){
            if (head->p_next!= NULL) {
                 tmp = head;
                 head = head->p_next;
                     for(int i=0; i<200;i++){     
                         free(tmp->author_name.given_name[i])   
                         free(tmp->author_name.surname[i])                             
                            }
                           free(tmp->author_name.given_name);
                           free(tmp->author_name.surname);
                           free(tmp);
                        }
                        else {
                            printf("free was sucesfull.\n");
                            break;
                        }
                    }
                }
                return 0;
   

每当我尝试释放////(TMP--&author_name.given_name [i]时,它就在链接列表中。 或者 /// tmp-&gt; fure_name.surname [i])我得到了细分故障,我将其放入printf中以查看它会破裂的位置,甚至在0索引上破裂,这总是满足的,所以问题不在在1-10之内的条件不知道会发生什么,也许我在指针算术上做错了什么?并且需要以不同的方式释放:/

my problem is with freeing a dynamic 2D array, that's inside linked list

typedef struct name{
    char **given_name;
    char **surname;
} Name;

typedef struct list {
    float id;
    struct name author_name;
    struct list *p_prev, *p_next;
} List;

void load_data(List** head){
     List* tmp_new = Null;
     while(1){
          tmp_new->author_name.given_name= (char**) malloc(10 * sizeof(char*));
          tmp_new->author_name.surname   = (char**) malloc(10 * sizeof(char*));
          while(condition){ //this condition is always whithin 1-10
               tmp_new->author_name.given_name[i]=(char*) malloc(200 * sizeof(char*));
               tmp_new->author_name.surname[i]   =(char*) malloc(200 * sizeof(char*));
         }
          given_name= "John"
          surname= "Blake"
          sscanf(name, "%s %s", tmp_new->author_name.given_name[i], tmp_new->author_name.surname[i]);
  
          tmp_new->p_prev = *head;
          tmp_new->p_next = NULL;
          (*head)->p_next = p_new;
          (*head) = p_new;

          // realloc again for the next enrty
         
           given_name= "Tom"
           surname= "Jerry"
          sscanf(name, "%s %s", tmp_new->author_name.given_name[i],tmp_new->author_name.surname[i]);
      }
     }
//once done within this function free it
if(*head != NULL) {
            while (1){
                if ((*head)->p_next!= NULL) {
                    tmp = (*head);
                    (*head) = (*head)->p_next;
                    for(int i=0; i<200; i++){
                            free(tmp->author_name.given_name[i]);
                            free(tmp->author_name.surname[i]);
                            }
                    free(tmp->author_name.given_name);
                    free(tmp->author_name.surname);
                    free(tmp);
                    }
                else {
                    break;
                }
            }
        }
}
int main()
    List* head = NULL;
    List* tmp;


    load_data(&head);
    if (head != NULL) {
        while (1){
            if (head->p_next!= NULL) {
                 tmp = head;
                 head = head->p_next;
                     for(int i=0; i<200;i++){     
                         free(tmp->author_name.given_name[i])   
                         free(tmp->author_name.surname[i])                             
                            }
                           free(tmp->author_name.given_name);
                           free(tmp->author_name.surname);
                           free(tmp);
                        }
                        else {
                            printf("free was sucesfull.\n");
                            break;
                        }
                    }
                }
                return 0;
   

whenever i try to free the ///(tmp->author_name.given_name[i])
or
/// tmp->author_name.surname[i]) i get segmentation faults, i put inside printf to see where it would break and it even breaks on 0 index, which is always full, so the problem isn't that while condition that's within 1-10, have no idea what might be happening, maybe I'm doing something wrong with pointer arithmetic? and needs to be freed differently :/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文