【发布时间】:2016-09-13 07:32:27
【问题描述】:
在下面的代码中,我收到了以下警告:
在函数“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 变量的版本相比有效吗?
【问题讨论】:
-
使用
=和指针意味着使指针指向另一个操作数所指示的内存位置
标签: c string variables pointers string-literals