我正试图用malloc
分配特定数量的内存,但当我运行程序时,它会给出一些随机字母输出,我看不出它有什么问题。这是我第一次用malloc
进行实验,希望你能理解。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ACE 1
#define CardSize 52
void count();
int main()
{
count();
return 0;
}
void count() {
int *cards;
int i;
cards = (int *)malloc(CardSize*sizeof(int));
for (i = 0; i < 4; i++) {
for (i = 1; i < 14; i++) {
printf("%dn", cards[i]);
}
}
}
基本上,它应该打印出我的卡片阵列中的1-13张[52]卡片,4个不同的时间。我不明白它为什么不这么做,希望有人能帮我。
基本上,它应该打印出我的卡片阵列[52]中的1-13张卡片,4个不同的时间。我不明白为什么它不做这个
在for循环中,您只使用了一个控制变量i
。对于打印1-13,您必须分配值,而代码中的任何位置都没有分配。试试这个代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ACE 1
#define CardSize 52
void count();
int main()
{
count();
return 0;
}
void count() {
int *cards;
int i,j;
cards = malloc(CardSize*sizeof(int));
for (i = 0; i < 4; i++) {
for (j = 0; j < 13; j++) {
cards[i*13+j]=j+1;
printf("%d ", cards[i*13+j]);
}
printf("n");
}
free(cards);
}
for (i = 0; i < 4; i++) { for (j = 0; j < 14; j++) { cards[i*13+j]=j+1; printf("%d ", cards[i*13+j]); }
步骤1:这里首先为循环初始化i=0
步骤2:循环初始化j=0
的第二步
步骤3:卡片[i*13+j]=j+1;将执行。此处为j=0
和i=0
,因此卡片[0]=1将被分配
步骤4:printf
将在此处打印cards[i*13+j]
的值j=0
,因此将打印卡片[0]的值。循环将再次进行到步骤2并递增j。将打印多达1-13。
步骤5:再次开始第一个for循环,再次打印1-13,依此类推,直到第一个for环路完成。
注意:不要强制转换malloc,我建议在动态内存分配后使用free()
来释放内存。
你也可以使用单循环而不是双循环
for (i = 0; i < CardSize; i++) {
cards[i]=(i%13)+1;
printf("%d ", cards[i]);
}
您为指针分配内存,但从不初始化。因此,您打印它并不能提供预期的输出。
您可以修改循环如下-
while(i<52){ // first initialize i=0
j=1; // set j to 1 in each iteration
while(j<14){ // iterate for 14 times
cards[i]=j; // initialize chards
printf("%d", cards[i]);
j++;
i++;
}
printf("n");
}
输出
注意-
1。您应该检查malloc
的返回,以及free
分配的内存。
2.malloc
语句中的强制转换是多余且不必要的。
您有两个循环,因此需要两个控制变量,并且必须计算线性化数组的索引。
void count() {
int *cards;
cards = (int *)malloc(CardSize*sizeof(int));
for ( int i = 0; i < 4; i++) { // first loop with control varible i
for (int j = 0; j < 13; j++) { // second loop with control varible j
int arrI = i*13+j; // linearized index
cards[arrI]= /* what ever */;
printf("%dn", cards[arrI]);
}
}
free(cards);
}