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

は GNU 拡張であるため、それを使用strfryする必要があります#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 を a に割り当てたい場合、char*指定したメッセージに文句を言います。

私のマニュアルページによると、#define _GNU_SOURCEソースコードの一番上、特に標準の #include の前に

#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 に答える