C 为什么要修改内存地址?

C 为什么要修改内存地址?,c,gtk,C,Gtk,我有一系列代码: printf("%p\n", gameGUI); printf("label %p\n", gameGUI->labelRoundType); gui_setRoundType(gameGUI->labelRoundType, gameGUI->game->rounds[roundId]); printf("label %p\n", gameGUI->labelRoundType); printf("%p\n",

我有一系列代码:

printf("%p\n", gameGUI);
printf("label %p\n", gameGUI->labelRoundType);
gui_setRoundType(gameGUI->labelRoundType,
                 gameGUI->game->rounds[roundId]);
printf("label %p\n", gameGUI->labelRoundType);
printf("%p\n", gameGUI);
函数gui_setRoundType的代码

int gui_setRoundType(GtkWidget *roundTypeLabel, struct Round *round)
{
    if (round == NULL)
        return ROUND_NULL;
    if (roundTypeLabel == NULL)
        return POINTER_NULL;

    char type[1] = { '\0' };
    intToChar(round->roundType, type);
    gtk_label_set_text(GTK_LABEL(roundTypeLabel), type);

    return NO_ERROR;
}
GameGUI结构的代码:

struct GameGUI {
    struct Game *game;
    struct Select *select;
    struct PlayerCards *playerCards;
    struct PlayersGUI *playersGUI;
    struct CardsFromTable *cardsFromTable;
    struct BidGUI *bidGUI;
    GtkWidget *windowTable;
    GtkWidget *fixedTable;
    GtkWidget *buttonShowScore;
    GtkWidget *imageTrump;
    GtkWidget *labelRoundType;
    GtkWidget *labelNoOfBids;
    GtkWidget *buttonStart;
    int bidPlayerId;
    int cardPlayerId;
};
我的问题是:为什么它会在所谓的gui_setRoundType()之后修改gameGUI变量的内存地址

输出示例:

0x1e8ff80
label 0x1e9dd50
label 0xcf9
0x1e8ff00
这是intToChar函数的代码

int intToChar(int number, char *string)
{
    int i, copy, j;
    char ch;

    if ((copy = number) < 0)
        number = -number;

    i = 0;
    do {
        string[i++] = number % 10 + '0';
    } while ((number /= 10) > 0);

    if (copy < 0)
        string[i++] = '-';
    string[i] = '\0';

    for (i = 0, j = strlen(string) - 1; i < j; i++, j--) {
        ch = string[i];
        string[i] = string[j];
        string[j] = ch;
    }

    return NO_ERROR;
}
int-intToChar(int-number,char*string)
{
int i,拷贝,j;
char ch;
如果((副本=编号)<0)
数字=-数字;
i=0;
做{
字符串[i++]=数字%10+'0';
}而((数/=10)>0);
如果(复制<0)
字符串[i++]='-';
字符串[i]='\0';
对于(i=0,j=strlen(string)-1;i
intToChar
函数中存在缓冲区溢出-您将长度为1的缓冲区
类型
传递给它,并且在函数中您可能写入超出此缓冲区边界的内容。这会触发未定义的行为,指针开始随机更改。

您在
intToChar
函数中有缓冲区溢出-您将长度为1的缓冲区
类型
传递给它,并且在函数中您可能写入超出此缓冲区边界的内容。这会触发未定义的行为,指针开始随机更改。

您的
intToChar
函数做什么?您确定它不会使传入的缓冲区溢出吗?由于您传入的缓冲区只能容纳1个元素,因此它非常无用,并且永远不能容纳任何文本。您的
intToChar
函数做什么?您确定它不会使传入的缓冲区溢出吗?由于您传入的缓冲区只能容纳1个元素,因此它是非常无用的,并且永远无法容纳任何文本。roundType始终是一个数字。即使对于数字,您也需要长度为2的缓冲区,用于在行
string[i]='\0'中添加的零终止如果长度为2,则工作正常。感谢您的帮助。roundType始终是一个数字。即使对于一个数字,您也需要长度为2的缓冲区,用于在
string[i]='\0'行中添加的零终止如果长度为2,则工作正常。谢谢你的帮助。