2014-01-03 3 views
-1

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

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

int main(int argc, char *argv[]){ 
    FILE *fd; 

    //Alocate memory on the heap; 
    char *UserInput = malloc(20); 
    char *OutputFile = malloc(20); 

    if(argc < 2){ 
    printf("Usage: %s <string to be written to /tmp/notes>\n", argv[0]); 
    exit(0); 
    } 

    //Copy data into the heap memory 
    strcpy(OutputFile, "/tmp/notes"); 
    strcpy(UserInput, argv[1]); 

    //Print out some debug messages 
    printf("___DEBUG___\n"); 
    printf("[*] UserInput @ %p: %s\n", UserInput, UserInput); 
    printf("[*] OutputFile @ %p: %s\n", OutputFile, OutputFile); 
    printf("[*] Distance between: %ld\n", UserInput - OutputFile); 
    printf("_________________\n\n"); 

    //Writing the data out to the file 
    printf("Writing to \"%s\" to the end of %s...\n", UserInput, OutputFile); 
    fd = fopen(OutputFile, "a"); 
    if (fd == NULL){ 
    fprintf(stderr, "Error openning %s\n", OutputFile); 
    exit(1); 
    } 

    fprintf(fd, "%s\n", UserInput); 
    fclose(fd); 

    return 0; 
} 

я исполняю как: ./heap тест и выход:

___DEBUG___ 
[*] UserInput @ 0x1a13010: test 
[*] OutputFile @ 0x1a13030: /tmp/notes 
[*] Distance between: -32 
_________________ 

Я думаю, что что-то не так происходит с «Расстояние между» \\ Максимальная длина argv[1] в int-типе «31» целых чисел \\ и максимальная длина argv[1] в типе «58» символов \\ , например:

./heap 123...01 => 31 integers 
./heap qqq..qqq => 58 characters 

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

+0

'UserInput' является полностью избыточной кстати. –

+0

Кроме того, что вы ожидаете от вывода? Два указателя не указывают внутри одного и того же массива, поэтому любой результат, который вы получаете, не имеет смысла (и это делает ваш код вызывать неопределенное поведение в любом случае). –

+3

Этот вопрос выглядит не по теме, потому что это бессмыслица. –

ответ

1

Здесь нет ничего плохого. Указатели назначаются функцией malloc(), которая может и присваивает указателям достаточно произвольные значения. Обычная реализация malloc() зарезервирует несколько байтов, чтобы отметить длину выделенного буфера, а также воспользоваться существующими размерами буфера в свободном списке. Поэтому, если вы выделяете два буфера, как вы это сделали, нет ничего, говоря, что они должны быть смежными в пространстве кучи. На самом деле их не будет.

Я не знаю, что вы здесь делаете, но «расстояние между двумя указателями malloc() не будет представлять собой точную длину буферов.

+0

спасибо. но, как я могу понять, сколько байт я могу дать в argv [1] моей программы? Я думаю, что нехорошо происходит с «-32» – MLSC

+0

Обратите внимание: это упражнение с переполнением буфера с использованием памяти кучи :) Спасибо вам за продвинутый – MLSC

+0

Это неоднозначный вопрос. Если вы хотите ограничить количество символов, введенных в UserInput, используйте функцию strncpy(). Если вы хотите получить все символы, используйте strlen (argv [1]), чтобы найти длину и malloc UserInput в соответствующем размере (не забудьте нулевое значение в конце). Или вы можете просто напечатать argv [1] напрямую и полностью пропустить UserInput. –

0

Malloc никогда не назначает непрерывную память для последующих запросов. Это зависит от текущего состояния свободной памяти.

Как хорошая практика программирования, пожалуйста, освободите оба распределения malloc до того, как существовала программа i.e перед возвратом 0.

free(OutputFile); 
free(UserInput); 
return 0; 
+0

@MortezaLSC - я отредактировал ваш код, чтобы освободить все распределения malloc до выхода программы. –

+0

спасибо, но он не работает ... спасибо :) – MLSC

Смежные вопросы