В моей ниже коде я получаю следующие предупреждения пошли постройки:Почему в этом коде работает указатель, а не нормальная переменная?
В функции «on_btn_Convert_clicked»: |
предупреждение: назначение делает целое число от указателя без приведения [включен по умолчанию] |
предупреждение: передающий аргумент 2 из 'gtk_label_set_text' делает указатель из целое число без актера [включено по умолчанию] |
|| === Сборка завершена: 0 ошибок, 2 предупреждения (ов), 1 секунд (ы)) === |
Если я запустил программу, так как она откроет графический интерфейс, но данная кнопка вызовет ошибку сегментации при нажатии и сбое программы.
#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;
}
Я не понимаю, как указатель, объект, который просто указывает на место в памяти, может быть равна «привет» и по-прежнему работать, как это?
Может ли кто-нибудь объяснить мне, почему переменная 'char hello' должна быть указателем (*) и не может быть просто строкой или символом char?
И наконец, можете ли вы обобщить, почему это работает против версии с нормальной переменной char?
Использование '=' с указателем означает, что указатель указывает на ячейку памяти, указанную другим операндом –