4

所以我是 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

4 回答 4

7

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

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

请注意,该strfry函数及其表亲memfrob并不完全严重,并且很少在生产中使用。

于 2013-03-15T22:36:58.497 回答
4

strfry可用,您需要

#define _GNU_SOURCE

否则原型不会暴露并且隐式声明被假定返回一个int.

于 2013-03-15T22:36:47.950 回答
2

问题是你没有原型,strfry()编译器假设它返回一个int. 当它想将该 int 分配给 achar*时,它会抱怨您指定的消息。

根据我的手册页,您需要#define _GNU_SOURCE在源代码的最顶部,尤其是在标准 #includes 之前

#define _GNU_SOURCE
/* rest of your program */
于 2013-03-15T22:36:34.763 回答
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;
}
于 2013-03-15T22:38:07.043 回答