2

I was wondering why does the following code not throw an error during compilation? :

#include <stdio.h>
char * func (char *);

int main()
{
    func("TINFO");
    func("INFO");
}

char * func(char * str)
{
    if (str[0] == 'T')
    return str + 1;
}

You see there is a return path from the function that does not return a char *

Similar Java code throws a compile time error, though.

Compiler used:

gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
4

2 に答える 2

3

All you have to do is raise the "warning" level on your compiler.

EXAMPLE:

$ gcc -o x x.c
  <= DEFAULT: No warnings, no errors

$ gcc -Wall -pedantic -o x x.c
x.c: In function `main':
x.c:14: warning: control reaches end of non-void function
x.c: In function `func':
x.c:24: warning: control reaches end of non-void function
于 2012-05-23T23:09:31.947 に答える
2

C標準6.9.1.12によると、関数の終わりに到達することは、呼び出し元が戻り値を使用する場合にのみ未定義の動作です。

関数}を終了するに到達し、関数呼び出しの値が呼び出し元によって使用される場合、動作は未定義です。

そのため、コンパイラはこのコードをコンパイルする必要があります。

于 2012-05-23T23:21:38.687 に答える