所以我是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
?
由于
答案 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;
}