【问题标题】:Why does setting a breakpoint make my code work?为什么设置断点会使我的代码工作?
【发布时间】:2010-11-12 15:40:45
【问题描述】:

我对@9​​87654321@ 很陌生,所以我确定我做错了,但这让我很困惑。

我的代码应该从用户那里获得一个标题,并在路由目录中创建一个具有该名称的文件夹。仅当我在 makeFolder() 实现上设置断点时它才有效。出于某种原因,在我单击 continue 之前稍作休息使其工作(我正在使用 Xcode)。

不起作用我的意思是它正确返回 0 但没有创建文件夹。

这是我第一次尝试用 C 做任何事情,我只是在胡乱学习它。

编辑非常感谢您的回答和 cmets。它现在按预期工作,我在此过程中学到了一些东西。你们都是学者和先生们。

#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;
}

【问题讨论】:

  • 当它不“工作”时会发生什么?
  • 这里一个可能的问题是,在makeFolder 中,您使用strcat 附加到“路径”,但您从未向路径写入任何内容以确保它是一个以空结尾的字符串与垃圾数据相反。不知道为什么断点会产生任何影响,但是在malloc 之后尝试*path = 0;,将数据的第一个字符设置为 nul 终止符。 strcat 的第一个参数必须是一个以 nul 结尾的字符串,否则 strcat 无法找到它的结尾以便追加。
  • 您有很多不必要的malloc 电话。一个简单的char path[MAX_TITLE_SIZE] 就可以了。
  • @aschepler 为了更清晰,我已经对其进行了编辑
  • 响应您的编辑 - 当然,垃圾数据也可能包含 0 字节,因此附加了 strcat,但随后您尝试创建一个名称不可能的目录,因为垃圾数据包含不允许的字符。

标签: c xcode debugging malloc


【解决方案1】:

malloc 的变量路径包含垃圾,因为你从来没有明确地填充它。在调试器中运行此代码可能会导致它意外地看到归零的内存,然后意外地给出预期的结果。

您至少应该像这样将path 的第一个字符设置为初始零:

path[0] = '\0';

否则concat()无法正常工作。

【讨论】:

  • 如果你 malloc 某个东西,在你给它赋值之前,它总是充满垃圾吗?
  • 不,它根本没有被填充,所以你会看到随机值在这个内存位置。
  • @MrMisterMan:它没有主动填充垃圾:malloc 不会在其上写入垃圾。 “垃圾”只是一个术语,意思是“具有不确定价值的记忆”。它可能充满了 0,也可能充满了调试器用来检测未初始化堆内存的某个值。当它被释放时,它可能具有包含在某些先前分配中的值。它可能包含黎曼假设的证明(尽管由于 MAX_TITLE_SIZE 仅为 256,这将是一些证明)。
  • @codymanix @Steve,谢谢,一切都变得清晰了(嗯,稍微不那么模糊了)
  • @MrMisterMan:重要的一点是,您对垃圾数据所做的几乎任何事情都会导致未定义的行为。我们可以推测为什么你的程序干净地退出而不是崩溃,说“也许运气好那里有一个 0,也许没有”,但这都是特定于你的机器的。就 C 语言而言,您就像在仙境中一样,任何事情都是允许的。
猜你喜欢
  • 2020-08-21
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多