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,则工作正常。谢谢你的帮助。