Почему установка точки останова заставляет мой код работать? - PullRequest
1 голос
/ 12 ноября 2010

Я очень плохо знаком с C, так что я уверен, что делаю грузы неправильно, но это меня озадачивает.

Мой код должен получить заголовок от пользователя и создать папку в каталоге маршрутов с этим именем. Это работает, только если я установил точку останова в реализации makeFolder(). По какой-то причине небольшой отдых перед нажатием continue заставляет его работать (я использую Xcode).

По не работает Я имею в виду, что он возвращает 0 правильно, но папка не создается.

Это одна из моих первых попыток сделать что-нибудь с C, и я просто бездельничаю, пытаясь выучить это.

Редактировать Большое спасибо за ваши ответы и комментарии. Сейчас он работает, как ожидалось, и я немного узнал по пути. Вы все ученые и джентльмены.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>

#define MAX_TITLE_SIZE 256

void setTitle(char* title) {
    char *name = malloc (MAX_TITLE_SIZE);
    printf("What is the title? ");
    fgets(name, MAX_TITLE_SIZE, stdin);

    // Remove trailing newline, if there
    if(name[strlen(name) - 1] == '\n')
        name[strlen(name) - 1] = '\0';

    strcpy(title, name);
    free(name);
}

// If I set a breakpoint here it works
void makeFolder(char * parent, char * name) {
    char *path = malloc (MAX_TITLE_SIZE);

    if(parent[0] != '/')
        strcat(path, "/");

    strcat(path, parent);
    strcat(path, "/");
    //strcat(path, name);
    //strcat(path, "/");
    printf("The path is %s\n", path);
    mkdir(path, 0777);
    free(path);
}

int main (int argc, const char * argv[]) {
    char title[MAX_TITLE_SIZE];
    setTitle(title);
    printf("The title is \'%s\'", title);
    makeFolder(title, "Drafts");
    return 0;
}

1 Ответ

6 голосов
/ 12 ноября 2010

Путь переменной malloc содержит мусор, потому что вы никогда его не заполняете. Запуск этого кода в отладчике может привести к тому, что он случайно увидит обнуленную память, которая затем случайно выдаст ожидаемые результаты.

Вы должны по крайней мере установить первый символ path в начальный ноль, например:

path[0] = '\0';

В противном случае concat() не может работать должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...