【发布时间】:2018-09-15 17:12:11
【问题描述】:
我是 C 语言的新手,所以这段代码中可能存在我还不知道的逻辑错误。有一个卡片结构,它具有价值和花色作为字段。
我对这段代码的思考过程是:
- 首先,创建一个指向卡片的指针。
- 其次,在 for 循环中创建卡片并分配该卡片的字段。
- 最后,指向创建的卡片并增加指针。
重复此过程,以便在内存地址中连续创建 52 个卡。
基本上我打算做的是为内存中的每 8 个字节创建一副卡片,但是循环内的 card_ptr++; 行并没有像我想象的那样工作。知道这里有什么问题吗?
我测试了注释部分,它按照我的意愿将指针增加了 8 个字节,但循环没有这样做。我还添加了打印语句以帮助您理解我的想法。
#include <stdio.h>
typedef enum {
SPADES,
HEARTS,
DIAMONDS,
CLUBS,
NUM_SUITS
} suit_t;
struct card_tag {
unsigned value;
suit_t suit;
};
typedef struct card_tag card_t;
int main(){
card_t *card_ptr;
printf("Initial card pointer created. %d\n", card_ptr);
for(int i =SPADES; i < NUM_SUITS; i++){
for(int j = 1; j < 14; j++){
card_t card;
card.value = j;
card.suit = i;
printf("Card -> Value = %d Suit = %d, is created.\n", card.value, card.suit);
card_ptr = &card;
printf("%d points to the last card.\n", card_ptr);
card_ptr++;
printf("Pointer is incremented to %p\n\n", card_ptr);
}
}
/*card_t *card_ptr;
printf("%d\n", card_ptr);
card_ptr++;
printf("%d\n", card_ptr);
card_ptr++;
printf("%d\n", card_ptr);
*/
}
【问题讨论】:
-
最好在循环外创建一个
cart_t类型的数组,然后用指针访问它。 -
使用一个数组,将指针分配给它,然后使用指针访问它。我就是这么说的。
-
printf("Initial card pointer created. %d\n", card_ptr);调用 未定义的行为 有两个原因。 1.%d不是正确的指针说明符,2.card_ptr没有初始化,所以它有一个不确定的值 -
@gunessun 您的代码调用了未定义的行为,这不是编译时错误。这意味着您的代码可以为所欲为。
-
您的代码没有在内存中创建 52 张卡片。它一次创建一张卡片。它会在循环迭代结束时销毁该卡,并在下一次迭代开始时创建一张新卡。为了创建 52 张卡片,您需要一个包含 52 个元素的数组。增加指针不会创建新卡片。
标签: c arrays pointers struct memory-address