【问题标题】:printf changing value of char*printf 改变 char* 的值
【发布时间】:2017-10-23 15:55:16
【问题描述】:

这是我的代码中发生这种情况的部分......无论我在 printf 的帮助下打印什么,它的输出都会重复 3 次,并且该值正在进入路径变量

char *path;
    char buf[1024];
    struct group grp;
    struct group *grpt;
    path=strdup(pointer);
    while((sd=readdir(dp))!=NULL)
    {   if(sd->d_name[0]=='.')
            continue;
        strcat(path,"/");
        strcat(path,sd->d_name);
        stat(path, &my_stat);
        printf("%s  \t ",sd->d_name);
        printf("\n");
        int x= (int) (strlen(path) - strlen(sd->d_name));
        path[x-1]='\0';
        path;
    }

【问题讨论】:

  • path=strdup(pointer); [...] strcat(path,"/"); strdup() 得到什么,都没有空间来附加一些东西。
  • 您需要精确管理您的存储。 pathstrdup 分配,您必须假设它只包含足够的存储空间来存储被复制的字符串(以及终止的空字节)。除非您知道它足够大,否则您不能将其用于其他用途。

标签: c string printf


【解决方案1】:
path=strdup(pointer);
...
strcat(path,"/");

这将导致未定义的行为。当strdup 被调用时,它会返回一个指针,指向一个足够大的内存块来保存字符串的副本。它可能更大,但不能保证。当您调用 strcat 时,您正在写入未分配的内存。

解决此问题的一种方法是手动指定路径应该有多大,并设置“足够大以用于所有目的”的值。像这样的:

char path[1000];
strcpy(path, pointer);

如果您想要更精细(不一定更好)的解决方案,可以使用realloc 更改分配的内存大小。

【讨论】:

  • s/1000/`PATH_MAX` from `<limits.h>`/
  • 这个PATH_MAX怎么用?
  • 你熟悉INT_MAX吗?
  • PATH_MAX 是包含最大支持文件名的空终止符的大小。这是一个限制。您可以尝试超越它,但不要期望事情会进展得如此顺利。 “如何使用它?” 像其他整数常量一样,我想?明智地... klutt,我想建议将您的示例更改为char path[PATH_MAX]; snprintf(path, sizeof path, "%s/%s", pointer, sd->d_name);(当然,跨越两行)。 OP 似乎想将整个目录列表放入内存中;所以也许要存储n 路径:typedef char path[PATH_MAX]; path *p = malloc(n * sizeof *p);...
猜你喜欢
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2021-05-31
  • 2019-06-21
  • 2015-03-17
  • 2019-10-19
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多