c - 尝试使用 snprintf 添加两个字符串时出现错误

标签 c string memory-management

我正在尝试使用 snprintf 添加两个字符串,但显然我不知道自己在做什么。

这是代码块:

char * filename = NULL;

(void)snprintf (filename, sizeof(filename), "%s/%s",
        PATH, FILE);  

我也试过:

char * filename = NULL;

(void)snprintf (filename, sizeof(PATH)+sizeof(FILE)+1, "%s/%s",
        PATH, FILE);  

PATH 和 FILE 是 header 定义的字符串。有时,此代码有效,有时无效。我确定这是某种内存问题,我做错了什么?

编辑: 我的问题是出于某种原因认为 snprintf 为您分配了内存。我接受解决这个问题的答案,因为这是我真正的问题,但我决定使用编译时字符串连接,因为这是一个非常好的技巧。

最佳答案

如果 FILE 和 PATH 在 header 中定义为字符串文字,那么您可以在编译时连接:

#include <stdio.h>
/* elsewhere in your headers */
#define FILE "foo.ext"
#define PATH "/dir/subdir"

/* After including those headers */
#define FULLPATH (PATH "/" FILE)

int main(int argc, char *argv[]) {
  printf("%s\n", FULLPATH);
}

或者在声明变量时直接执行并在代码的其他地方引用它:

#include <stdio.h>

#define FILE "foo.ext"
#define PATH "/dir/subdir"

char fullpath[] = PATH "/" FILE;

int main(int argc, char *argv[]) {
  printf("%s occupies %d bytes\n", fullpath, sizeof(fullpath));
}

关于c - 尝试使用 snprintf 添加两个字符串时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1155346/

相关文章:

c - 如何实现一个函数以在其本地范围之外使用?

c - 基数右边的分数 - float 转换

python - 不从列表中删除

string - 将相同的字符串附加到 Groovy 中的字符串列表

string - 将 sizeof() offsetof() 宏的结果嵌入到 const char 数组中?

.net - 如何确定我的 .NET 程序使用了多少内存?

c++ - 是否保证堆分配的 block 地址不会(隐式地)改变?

c - setpgid 的竞争条件