处理在C中作为参数传递的指针的函数返回值

时间:2015-04-16 15:52:10

标签: c function pointers

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

案例1:

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*/;

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

3 个答案:

答案 0 :(得分:3)

您的两个案例都同样安全,但不需要第一个案件中的额外作业。

strcat不会重新分配任何内容,也不会“更改指向的内存”,因此无需在此处获取返回值。调用后指针保证保持不变。

答案 1 :(得分:2)

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

因此strcat()没有分配内存。

答案 2 :(得分:0)

通常”你没有使用显式赋值,这就足够了

strcat(dst, src);

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

  • 这两个中的任何一个都是安全的,但指定一个自己的指针虽然没有多大意义。

这是从strcat()

linux手册中提取的
  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);

所以,它会强迫你使用第一种方法。