-1

我被这个非常简单的例子打倒了,这个例子起初看起来很简单,但最近让我很头疼。有人能告诉我这些功能有什么问题吗?

注意:我正在使用 C。这是一项要求。

#include "stdafx.h"
#include <string.h>
#include <stdio.h>

char* telegram_input()
{
    char message[100];

    printf("Write down the telegram: ");
    gets(message);

    return message;
}


int _tmain(int argc, _TCHAR* argv[])
}

        printf("Write your message:\n\n");
    char * myMessage; 

    myMessage = telegram_input();

        //HERE's the problem!!!!! -->
        printf("The written message is: %s.", myMessage);


    return 0;
}

问题是当我将数组的值返回给 char* 指针时,它只保存数组的第一个值,它是一个不正确的值。当我用'printf'打印它时,它会显示一个笑脸字符。那个怎么样?为什么会这样?如果我没有使用上述功能,我就不会遇到这个问题。

4

2 回答 2

2

您正在返回在堆栈上分配的变量的本地实例。如果你想正确地做到这一点,有几种方法。您可以在堆上分配一个 char 数组,并且在打印后必须释放它。另一种方法是返回 astatic const char*然后打印它。这种方法不是线程安全的,如果任何其他线程调用这个函数,那么数组中的数据当然会改变,给你一个意想不到的打印输出。甚至另一种方法是将您想要将消息写入的目的地传递给可能为您提供最多控制权的函数。我敢肯定还有其他人,但这应该给你一些想法。

#include "stdafx.h"
#include <string.h>
#include <stdio.h>

static const char* telegram_input_static()
{
    static char message[100];

    printf("Write down the telegram: ");
    gets(message);

    return message;
}

char* telegram_input_heap()
{
    char* message = malloc(sizeof(char) * 100);

    printf("Write down the telegram: ");
    gets(message);

    return message;
}

void telegram_input_dest( char* dest )
{
    printf("Write down the telegram: ");
    gets(dest);
}    

int _tmain(int argc, _TCHAR* argv[])
{

    printf("Write your message:\n\n");
    char * myMessage; 

    myMessage = telegram_input_heap();
    printf("The written message is: %s.", myMessage);
    free(myMessage);

    myMessage = (const char*)telegram_input_static();
    printf("The written message is: %s.", myMessage);

    char destination[100];
    telegram_input_dest(destination);
    printf("The written message is: %s.", destination);

    return 0;
}
于 2013-02-28T19:51:11.987 回答
0

Message 是一个局部变量,您将返回它,它将被取消分配。您必须创建指针并发送它。然后在主目录中删除它。

char* telegram_input()
{
    char *message = malloc( sizeof(char) * (100) );

    printf("Write down the telegram: ");
    gets(message);

    return message;
}

int _tmain(int argc, _TCHAR* argv[])
{

    printf("Write your message:\n\n");
    char * myMessage; 

    myMessage = telegram_input();

        //HERE's the problem!!!!! -->
        printf("The written message is: %s.", myMessage);

    free(myMessage);
    return 0;
}
于 2013-02-28T19:54:27.707 回答