【问题标题】:Why C Macro gets truncated?为什么 C 宏会被截断?
【发布时间】:2011-05-17 03:04:09
【问题描述】:

我将一个 C 宏传递给一个以char * 形式接收它的函数。没有任何理由,宏中的最后一个字符会被截断。我怀疑有些内存泄​​漏,但找不到哪里。

#define FROM "/some/local/path/from/"
#define TO "/some/local/path/to/"
....
char file[_D_NAME_MAX + 1] = {'\0'};
....
funMove(file, FROM, TO);
....
....
int funMove(char *file, char *from, char *to) {
//here the to value is one character less (/some/local/path/to) slash got truncated
}

【问题讨论】:

  • 你如何确定它被截断了?
  • 不,对不起,不相信你。你要么喝醉了,要么(更有可能)有什么else是你没有向我们展示的错误:-)
  • 向我们展示 C 预处理器的文本输出。
  • 我们需要更多信息。
  • 由于您没有显示任何动态内存分配,因此在此代码中泄漏不是问题。由于您没有展示您如何确定to 中的值被截断,因此我们无法评论该问题。要截断它,您必须有一个可修改的字符串(而不是只读字符串),并且必须修改字符串以用 NUL '\0' 替换尾部斜杠。许多编译器将字符串文字放入文本(代码)段,因此这些字符串是不可修改的。

标签: c string memory memory-leaks macros


【解决方案1】:

您向我们展示的代码没有任何问题,因为以下工作正常:

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

#define _D_NAME_MAX 50

#define FROM "/some/local/path/from/"
#define TO "/some/local/path/to/"

char file[_D_NAME_MAX + 1] = {'\0'};

int funMove(char *file, char *from, char *to) {
    printf ("[%s] [%s] [%s]\n", file, from, to);
    return 0;
}

int main (void) {
    strcpy (file, "fspec");
    int x = funMove(file, FROM, TO);
    printf ("[%d]\n", x);
    return 0;
}

它输出:

[fspec] [/some/local/path/from/] [/some/local/path/to/]
[0]

正如预期的那样,如果您看到 to 被截断,那么肯定是其他地方存在问题。

【讨论】:

    【解决方案2】:

    抱歉!!实际上,代码没有任何问题,宏并没有被截断而是被覆盖了。除了斜杠之外,还有另一个具有相同名称和内容的宏。因此,宏被替换而不是预期的。

    #define TO "/some/local/path/to" //header file 1
    #define TO "/some/local/path/to/" //header file 2
    

    我只是想到了头文件 2,并误解了宏被截断了。实际上,使用的是头文件 1 中的宏,而不是预期的文件 2。

    感谢您的所有回答和支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 2011-08-20
      • 2013-08-29
      • 2011-07-24
      相关资源
      最近更新 更多