2015-11-28 5 views
2

Я занимаюсь раздражающей ошибкой повреждения памяти в течение нескольких часов. Я проверил каждый связанный поток здесь, и я не смог его исправить.malloc(): повреждение памяти в странном месте

Прежде всего, я пишу простой терминал в C. Я разбираю команды между символами pipe (|) и redirection (>, < и т. Д.) И размещаю их в очереди. Ничего сложного!

Вот структура данных для очереди;

struct command_node { 
    int index; 
    char *next_symbol; 
    struct command_node *nextCommand; 
    int count; 
    char **args; 
}; 

Когда я храню небольшие строки в указателе ** args, все работает отлично. Однако, когда один из аргументов длинный, я получаю malloc(): ошибка повреждения памяти. Например, следующая первая команда работает отлично, вторая команда вызывает ошибку

1st: ls -laF some_folder | wc -l 

    2nd: ls -laF /home/enesanbar/Application | wc -l 

я запускаю отладчик, он показал, что таНос() вызов для нового узла в очереди вызывает ошибку.

newPtr = malloc(sizeof(CommandNode)); 

Я тщательно выделить массив строк и освобождение после я сделал с ними следующим образом:

char **temp = NULL; 
    temp = malloc(sizeof(char*) * number_of_args); 

    /* loop through the argument array */ 
    for (i = 0; i < number_of_args; i++) { 
     /* ignore the remaining commands after ampersand */ 
     if (strcmp(args[i], "&") == 0) return; 

     /* split commands by the redirection or pipe symbol */ 
     if (!isSymbol(args[i])) { 
      temp[count] = malloc(sizeof(strlen(args[i])) + 1); 
      strcpy(temp[count], args[i]); 
      count++; 

      /* if it is the last argument, assign NULL to the symbol in the data structure */ 
      if (i + 1 == number_of_args) { 
       insertIntoCommands(&headCommand, &tailCommand, temp, NULL, count); 
       for (j = 0; j < count; j++) free(temp[j]); 
       count = 0; // reset the counter 
      } 

     } 
     else { 
      insertIntoCommands(&headCommand, &tailCommand, temp, args[i], count); 
      for (j = 0; j < count; j++) free(temp[j]); 
      count = 0; // reset the counter 
     } 
    } 

Должно быть, я что-то пропустил, или есть что-то я не знаю, о поля args и распределение нового узла, хотя я ничего не делал раньше.

+1

'темп [число]' <- что 'count'? –

+0

, чтобы отслеживать, где поставить следующий аргумент, и я также сохраняю его для удобства при печати материала для отладки. – enesanbar

+2

'sizeof (strlen (...' вероятно, не то, что вы хотите). Drop sizeof – Art

ответ

1

но как можно обернуть число вокруг sizeof из-за ошибки в распределении узла? Я просто пытаюсь понять из любопытства.

Как я уже говорил в своем комментарии, вы пытаетесь получить размер указателя внутри функции strlen, а не длину, которая предоставляется через функцию.

Пожалуйста, обратите внимание на следующее:

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


int main(void){ 
    char *name = "Michi"; 
    size_t length1, length2; 

    length1 = strlen(name); 
    length2 = sizeof strlen(name); 

    printf("Length1 = %zu\n",length1); 
    printf("Length2 = %zu\n",length2); 
    return 0; 
} 

Выход:

Length1 = 5 
Length2 = 8 

еще одно, после того как вы free(temp[j]) не забудьте free(temp) также.

Что-то вроде этого:

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


int main(void){ 
    long unsigned int size = 2,i; 
    char **array; 

    array = malloc(sizeof(char*) * size * size); 

    if (array == NULL){ 
     printf("Error, Fix it!\n"); 
     exit(2); 
    } 

    for (i = 0; i < size; i++){ 
     array[i] = malloc(sizeof(char*) * 100); 
    } 

    /* do code here */ 

    for (i = 0; i < size; i++){ 
     free(array[i]); 
    } 
    free(array); 

    return 0; 
}