Strcmp与C中的Printf相矛盾

Strcmp与C中的Printf相矛盾,c,string,pointers,C,String,Pointers,我传递一个指向void函数的指针,该函数的目的是动态分配和创建一个字符串(包含完整的文件路径) 在函数结束时,我使用printf(%s)进行检查,该函数似乎工作得很好(对于示例运行中的~10个测试文件)。然而,在调用void之后,我在main中再次检查指针,结果似乎没有得到维护 在void函数的末尾: printf("%s\n", *ptr) returns usr/path/file 大体上: printf("%s\n", *ptr) returns usr/path/fil50(?? 像

我传递一个指向void函数的指针,该函数的目的是动态分配和创建一个字符串(包含完整的文件路径)

在函数结束时,我使用
printf(%s)
进行检查,该函数似乎工作得很好(对于示例运行中的~10个测试文件)。然而,在调用void之后,我在main中再次检查指针,结果似乎没有得到维护

在void函数的末尾:

printf("%s\n", *ptr) returns usr/path/file
大体上:

printf("%s\n", *ptr) returns usr/path/fil50(??
像这样的事情发生在一些较长的文件路径上(较短的字符串似乎不受影响)。我使用strcpy和strcat在两个char缓冲区(用于目录路径和文件名)上创建void函数内的字符串

真正奇怪的是-我在两个位置(在void函数末尾和main中)添加了
strcmp
strlen
检查
*ptr
字符串,并且:

  • strlen对于这两个是相同的,即使外部打印的字符串明显更长!请参见上面的示例。我能清楚地分辨出来,因为每根字符串都打印在新的一行上
  • strcmp返回0,即使打印的字符串明显不同
  • 我无法解释这种行为…函数内外*ptr的变化是一回事,但是printf和strcmp怎么会相互矛盾呢

    我找不到其他有过这种经历的人,如果有任何帮助,我将不胜感激

    编辑-我应该提到void函数试图替换一个浪费大量内存的现有主内操作(在大量缓冲区上调用sprintf)。坦率地说,我只是问了一个关于strcmp和printf之间矛盾的一般性问题,但我当然愿意提供更多的证据

    int main(int argc, char *argv[]) {
    char buff[MASSIVE_SIZE];
        sprintf(buff, "%s/%s", dir, path->d_name);
        char **ptr = (char **)malloc(sizeof(char*));
        make_full_path(dir, path->d_name, ptr);
        printf("external, strcmp:%d\n%s\n", strlen(*ptr), *ptr);
        printf("strcmp=%d\n", strcmp(buff, *ptr));
    }
    
    
    void make_full_path (const char *dir_name, char *other_name, char **pptr){
    int len_one = strlen(dir_name);
    int len_two = strlen(other_name);
    
    char dest[len_one+2];
    strcpy(dest, dir_name);
    dest[len_one] = '/';
    dest[len_one+1] = '\0';
    char src[len_two+1];
    strcpy(src, other_name);
    src[len_two] = '\0';
    *pptr = strcat(dest, src);
    printf("internal, strlen=%d:\n%s\n", strlen(*pptr), *pptr);
    }
    
    然而,在调用void之后,我在main中再次检查指针,结果似乎没有得到维护

    这可能只意味着一件事:返回指向本地的指针。这是未定义的行为:

    char dest[len_one+2];
    ...
    *pptr = strcat(dest, src); // Passing a local back to main
    
    将其替换为调用
    malloc
    将解决此问题:

    char dest[len_one+strlen(other_name)+2];
    ...
    strcat(dest, src);
    *pptr = malloc(strlen(dest)+1);
    strcpy(*pptr, dest);
    

    不看代码就不可能知道出了什么问题。我猜您没有分配足够的空间。欢迎使用堆栈溢出。请阅读和了解如何创建MCVE()。除非您向我们展示一些重现问题的代码,否则我们真的无能为力,而且一旦您展示了代码,我们可能会很容易为您提供帮助。注意MCVE的“最小”部分;这很重要。你是根据斯特伦的测量来分配空间的吗?是否为空终止符添加1?如果返回指向本地内存的指针而不是动态分配的(
    malloc()
    等)内存,则可能会发生这种情况。动态分配内存的情况就不那么常见了。在看到您的分配代码等之前,我们必须保留判断权。有一件令人惊讶的事情需要尝试:在函数中打印两次。如果您得到不同的结果,那么几乎可以肯定您正在处理由函数返回的本地堆栈内存。投票重新开放。读第一句话,他说他确实分配内存这也是我的第一个假设,但我们确实需要看看代码才能给出正确的答案。@MeikVtune我怀疑OP称VLA为“动态分配”。没有其他解释了。@MeikVtune:VLA是“可变长度数组”——一个在运行时分配给函数的本地数组,其大小不固定。例如:
    intfunc(intn){intarr[n];…}
    将是一个VLA。@MeikVtune我就知道!(参见OP的编辑,他正在使用VLA并将其返回给呼叫方)。