c - 为什么指针起作用而不是这段代码中的普通变量?

标签 c string variables pointers string-literals

在我下面的代码中,我得到了以下警告:

In function ‘on_btn_Convert_clicked’:|

警告:赋值从指针生成整数而不进行强制转换[启用 默认]|

警告:传递“gtk_label_set_text”的参数 2 使指针来自 没有强制转换的整数 [默认启用]|

||=== 构建完成:0 个错误,2 个警告(0 分钟,1 第二个)===|

如果我按原样运行程序,它会打开 GUI,但有问题的按钮在按下时会导致段错误并使程序崩溃。

#include <stdlib.h>
#include <stdio.h>
//include gtk headers
#include <gtk/gtk.h>

//define pointer variable names
GtkWidget  *plblFileName;
GtkWidget  *pbtnConvert;
GtkWidget  *pbtnFileChooser;


//prototype functions
char on_btn_Convert_clicked();

char on_btn_Convert_clicked()
{
   //define variables
   char hello;

   hello = "hello!";

   gtk_label_set_text(GTK_LABEL(plblFileName), hello);
   return 0;
}

//start main loop
int main( int    argc,
      char **argv )
{
    GtkBuilder *builder;
    GtkWidget  *window;
    GError     *error = NULL;

    //Init GTK+
    gtk_init( &argc, &argv );

    //Create new GtkBuilder object
    builder = gtk_builder_new();
    //Load UI from file. If error occurs, report it and quit application.
    //Replace "tut.glade" with your saved project.
    if( ! gtk_builder_add_from_file( builder, "testGTK.ui", &error ) )
    {
        g_warning( "%s", error->message );
        g_free( error );
        return( 1 );
    }

    //Get main window pointer from UI
    window = GTK_WIDGET( gtk_builder_get_object( builder, "windowMain" ) );

    // get pointer to the label and button
    plblFileName = GTK_WIDGET(gtk_builder_get_object(builder, "lbl_FileName"));
    pbtnConvert = GTK_WIDGET(gtk_builder_get_object(builder, "btn_Convert"));
    pbtnFileChooser = GTK_WIDGET(gtk_builder_get_object(builder, "btn_Choose"));

    //connect the button with its signal
    g_signal_connect(G_OBJECT(pbtnConvert), "clicked", G_CALLBACK(on_btn_Convert_clicked), NULL);

    //Destroy builder, since we don't need it anymore
    g_object_unref( G_OBJECT( builder ) );

    //Show window. All other widgets are automatically shown by GtkBuilder
    gtk_widget_show( window );

    //Start main loop
    gtk_main();

    return( 0 );
}

但是,如果我将变量“hello”设为指针,那么错误就会消失并且一切正常。

像这样:

char on_btn_Convert_clicked()
{
   //define variables
   char *hello;

   hello = "hello!";

   gtk_label_set_text(GTK_LABEL(plblFileName), hello);
   return 0;
}

我不明白一个指针,一个只指向内存中某个位置的对象,怎么可以等于“hello”并且仍然这样工作?

谁能向我解释为什么“char hello”变量需要是一个指针 (*) 而不能只是一个字符串或“char[]”?

最后,您能总结一下为什么这与具有普通 char 变量的版本相比有效吗?

最佳答案

因为在你代码的第一部分

char hello;
hello = "hello!";

是错误的,因为您的编译器已经警告过您。

A string literal"Hello!" 的形式返回指向第一个元素的指针,即字符串中第一个元素的地址,并且不能存储到 char 中。您将需要一个 char * 来保存它。

或者,您可以使用数组 char hello[] = "hello!";。这将创建一个数组并使用字符串文字“hello!”初始化该数组,这也应该可以正常工作,但一个简单的(标量)char 无论如何都不起作用。

关于c - 为什么指针起作用而不是这段代码中的普通变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39464504/

相关文章:

c - c中父子共享内存

excel - 检测单元格中超过 5 个字符的宏(邮政编码)

c++ - 如何使语言友好功能降低?

python-3.x - 如何从电影数据集中提取用户评分

c - 符号扩展至 16 位

c - GtkCombo 回调中的 gtk_message_dialog

python - 在 bash 中获取变量类型

java - 找不到变量

c - 当影响 int 的值时明显出现段错误

c# - 如何在 C# 中将列表中的元素数保存为变量?