【问题标题】:Program prints garbage instead of the actual returned value from a function call [duplicate]程序打印垃圾而不是函数调用的实际返回值[重复]
【发布时间】:2015-09-20 03:25:05
【问题描述】:

我编写了一个算法来从字符串中提取单词并将它们存储在一个数组中,但是我得到了一个不需要的结果,我不知道为什么。输出是一个非常奇怪的字符。

#include <stdio.h>
#include <windows.h>

char *extract(char *String)
{
char str[10][20];
int x = -1,y = 0,z = 0;
for( size_t n = 0 ; n < strlen(String) ; n++ )
{
    y++;
    if( String[n] == ' ' ) y = 0, z = 0;

    if( y == 1 ) x++;

    if( y > 0 )
    {
        str[x][z] = String[n];
        z++;
        str[x][z] = '\0'; //Comment this*********
    }
}

/*for( int n = 0; n < 10; n++ ) Uncomment this*****
{
    str[n][3] = '\0';
}*/

    return str[7];
}

int main()
{
    printf( "WORD : %s\n",extract("POL POL POL POL POL POL POL POL POL POL") );
    system("PAUSE");
    return 0;
}

这段代码的错误在哪里?

注意:当我在其他地方使用 printf 和 strlen 时,我也会得到奇怪的字符。

【问题讨论】:

    标签: c function pointers printf return-value


    【解决方案1】:

    我在这里看到的问题是,str 是函数extract() 的局部变量,而您正试图返回它的地址,并将返回的值用作printf() 的参数。它调用 UB。

    澄清一下,str 将一直存在,直到 extract() 完成执行。一旦它完成执行并返回给调用者,str 将不存在。因此,返回的指针将指向一个 invalid 内存位置。进一步使用该返回值将导致undefined behaviour

    【讨论】:

    • 这是一个没有 UB 的工作示例,它将结果复制到输出缓冲区:ideone.com/54aZh0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多