[英]C can't print a string twice
我正在做一個必須創建Black Jack模擬的項目。 因此,我首先創建了一個牌組和一個繪制功能。 由於C中沒有字符串,因此我創建了兩個指針數組以將它們用作自定義字符串數組。 事實是,當我打印卡以查看其價值和西裝時,才第一次打印期望的卡。 第二次是一團糟。 誰可以給我解釋一下這個 ? 這是我的代碼
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
char* suit[] = {"Diamonds", "Hearts", "Spades", "Clubs"};
char* facevalue[] = { "Seven", "Eight", "Nine", "Ten", "Jack","Queen", "King", "Ace"};
char* drawCard()
{
char* card[50];
int cardNumber=rand()%8;
int cardColor=rand()%4;
strcpy(card,facevalue[cardNumber]);
char of[]=" of ";
char* xrwma =suit[cardColor];
strncat(card,of,5);
strncat(card,xrwma,8);
return card;
}
int main()
{
srand(time(NULL));
char* c=drawCard();
puts(c);
puts(c);
return 0;
}
變量card
是函數drawCard
的局部數組。
這樣,當函數drawCard
執行時,它會分配在堆棧中。
函數drawCard
返回后,您將不再可以依賴此數組的內容。
任何后續的操作都可以隨時覆蓋該內存。
您的程序在第一次調用puts
成功將其打印出來的事實,無非是“碰運氣”-在第一次調用函數fputs
時,正確的字符恰好位於變量c
指向的內存中。
但是由於函數fputs
也使用堆棧,因此此后不久將覆蓋該內存,並且在您再次調用fputs
時,先前的字符值不再存在。
順便說一句,看着變量card
的用法,我感覺到您打算將其聲明為char card[50]
而不是char* card[50]
。
嚴格來說,問題在於drawCard()
返回的自動變量的生存期。 僅對一個函數調用實例有用。 C不會阻止您返回它,但是以后肯定不會有用。
這樣做的原因是:在堆棧上分配了本地( 自動存儲類)。 真的很快 一個算術運算符(從堆棧指針中減去)可以分配函數中的每個局部變量。
但是當調用返回時,堆棧將被調整回去。 此時, 下一個函數調用實例將重用相同的空間。 如果您在該空間上停留參考,它將被表面上隨機且不斷變化的東西所破壞...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.