【问题标题】:Handling function return value of pointers passed as argument in C处理在 C 中作为参数传递的指针的函数返回值
【发布时间】:2015-04-16 15:52:09
【问题描述】:

我的问题涉及像 memset 和 strcat 这样的方法,它们返回作为参数传递的指针。例如:

案例一:

const char *src = /*assign space*/;
char *dst = /*assign space*/;
dst = strcat(dst, src);

案例 2:

const char *src = /*assign space*/;
char *dst = /*assign space*/;
strcat(dst, src);

情况 2 是否被认为是不安全的冒险被调用的函数更改了指向的内存。是否应该始终使用案例 1 的显式重新分配?

如果要使用案例2,可以变体:

char * const dst = /*assign space*/;

用于确保调用后指针保持不变?

【问题讨论】:

    标签: c function pointers


    【解决方案1】:

    您的两个案例都一样安全,但不需要第一个案例中的额外分配。

    strcat 不会重新分配任何东西,也不会“改变指向的内存”,所以这里不需要取返回值。 保证指针在调用后保持不变。

    【讨论】:

    • 不,我没有修改 const char*。我正在修改 dst 指向的位置。 src 没有被修改,只是从那里复制过来的。
    • @user3814660 strcat 的目的是在dst 的末尾添加一些东西。这意味着dst 必须足够大,而不是const,因为它会被修改。如果你真的想使用char*,你可以写char* dst = "Test\0Empty space"之类的东西,但它不是很干净。
    • 是的。但试图引起注意“您正在尝试使用 strcat 修改 const char*,这是未定义的行为。”正如您所说,来自 src 的 char 被附加到 dst。但是你引用的声明,我从代码 sn-p 看不出这是怎么回事。
    • @user3814660 这还不清楚。 strcat 修改了你的const char* 指向的字符串,我会解决的,谢谢:)
    • :) 我猜你的意思是“strcat 修改了你的char * 指向的字符串”
    【解决方案2】:

    dst 不会改变。 dst 必须足够大以包含连接的字符串。

    所以strcat()没有分配内存。

    【讨论】:

      【解决方案3】:

      通常”你不用显式赋值,这就够了

      strcat(dst, src);
      

      返回的指针和传递的指针都包含相同的地址,即你之前分配的内存地址。

      • 这两种方法中的任何一种都是安全的,但为自身分配一个指针并没有多大意义。

      这是从linuxstrcat() 的手册中提取的

        A simple implementation of strncat() might be:
      
             char*
             strncat(char *dest, const char *src, size_t n)
             {
                 size_t dest_len = strlen(dest);
                 size_t i;
      
                for (i = 0 ; i < n && src[i] != '\0' ; i++)
                     dest[dest_len + i] = src[i];
                 dest[dest_len + i] = '\0';
      
                return dest;
             }
      

      如你所见,dest 没有改变,所以返回的指针和传递的指针指向同一个地址。

      还有这个

      char * const dst = /*assign space*/;
      

      不会让你这样做

      dst = strcat(dst, src);
      

      所以,无论如何它都会强制你使用第一种方法。

      【讨论】:

      • 谢谢@iharob。标准库中是否存在可以重新分配内存的函数?
      • 谢谢@tux3。标准库中是否存在可以重新分配内存的函数?
      • 是的realloc() 它会在必要时将旧数据复制到新内存中,并在必要时释放内存。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多