strfry(char * __ string)返回int?

时间:2013-03-15 22:33:00

标签: c

所以我是C的新手,当我遇到https://www.gnu.org/software/libc/manual/html_node/strfry.html#strfry时,我正在玩GNU C库中的函数

好奇,我写了一个小测试程序:

1 #include <stdio.h>
2 #include <string.h>
3 
4 main ()
5 {
6     char *str = "test123abc";
7     char *other;
8 
9     other = strfry(str);
10    printf("%s\n", other);
11     return 0;
12 }

gcc test.c输出test.c:9: warning: assignment makes pointer from integer without a cast

为什么?

/usr/include/string.h包含以下条目:

extern char *strfry (char *__string) __THROW __nonnull ((1));

char *function(...)如何返回int

由于

4 个答案:

答案 0 :(得分:7)

由于strfry是GNU扩展,因此您需要#define _GNU_SOURCE才能使用它。如果您未能提供#define,则声明将不可见,编译器将自动假定该函数返回int

正如perreal所指出的,一个相关问题是修改文字字符串是未定义的行为。一旦你对编译器可以看到strfry的声明,就会适时报告。

请注意strfry函数及其表兄memfrob并不完全严重,很少用于制作。

答案 1 :(得分:4)

strfry可用,您需要

#define _GNU_SOURCE

否则原型不会暴露,假定隐式声明返回int

答案 2 :(得分:2)

问题是你没有strfry()范围内的原型,编译器假定它返回int。当它想要将该int分配给char*时,它会抱怨您指定的消息。

根据我的手册页,您需要在源代码的最顶部#define _GNU_SOURCE,特别是在标准#include

之前
#define _GNU_SOURCE
/* rest of your program */

答案 3 :(得分:1)

您无法修改文字字符串:

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>

int main () {
  char *str = "test123abc";
  char other[256];
  strcpy(other, str);
  strfry(other);
  printf("%s\n", other);
  return 0;
}