我有一个指针数组,我想将所有值都设置为0
。
这是我的代码:
#define EMPTY 0
void initBoard(int *ptr, int n){
n = n * n;
ptr = (int*)malloc(n*sizeof(int));
int i = 0;
for(i;i<n;i++){
*ptr = EMPTY;
*ptr++;
}
i = 0;
for(i;i<n;i++){
printf("%d\n",*ptr);
*ptr++;
}
}
运行此代码时,我希望得到(N == 0):
0
0
0
0
相反,我得到了这个:
394066110
7321
6890384
6881472
为什么我会这样做?
编辑:
void printBoard(int *ptr){
printf("%d - %d - %d\n", ptr, ptr+1, ptr+2);
printf("%d - %d - %d\n", ptr+3, ptr+4, ptr+5);
printf("%d - %d - %d\n", ptr+6, ptr+7, ptr+8);
}
将打印出来:
0 - 4 - 8
12 - 16 - 20
24 - 28 - 32
这是我调用函数时的样子:
int *ptr, win = 0;
initBoard(*ptr);
printBoard(*ptr);
编辑2:
#include <stdio.h>
#include <stdlib.h>
//define
#define EMPTY 0
#define CROSS 1
#define CIRCLE 2
#define NO_WIN 0
#define PLAYER_WIN 1
#define COMPUTER_WIN 2
#define DRAW 3
//funktioner
void printBoard(int *ptr);
int checkWin(int *ptr);
void computerMove(int *ptr);
void initBoard(int *ptr);
int main()
{
int *ptr, win = 0;
initBoard(*ptr);
printBoard(*ptr);
return 0;
}
void printBoard(int *ptr){
printf("%d - %d - %d\n", ptr[0], ptr[1], ptr[2]);
}
int checkWin(int *ptr){
return 0;
}
void computerMove(int *ptr){
}
void initBoard(int *ptr){
ptr = malloc(9*sizeof(int));
int i = 0;
//int *orig = ptr; //spara pointern
for(i;i<9;i++){
*ptr = EMPTY;
ptr++;
}
}
答案 0 :(得分:2)
您误解了解除引用运算符*
和后增量运算符++
的交互方式。
当你写这个*ptr++
时,你说&#34;首先,给我指针的可写值;然后递增指针&#34;。此表达式本身没有意义,因为取消引用的结果将被丢弃。换句话说,它相当于ptr++
。
现在考虑你的第二个循环。您的指针指向已分配块结尾的一个指针。此时,取消引用它是非法的。
您可以通过在进入第一个循环之前存储原始指针并使用保存的值在第二个循环之前重置ptr
来解决此问题:
int i = 0;
int *orig = ptr; // Save the original pointer
for(i;i<n;i++){
*ptr++ = EMPTY; // Combine ++ and * on assignment
}
i = 0;
ptr = orig; // Restore the original pointer
for(i;i<n;i++){
printf("%d\n", *ptr++); // Combine ++ and * on read
}
如果您希望initiBoard
初始化之前未设置的ptr
,请更改签名,如下所示:
void initBoard(int **ptrPtr, int n);
致电initBoard(&ptr, n)
,并使用ptrPtr
加上额外的解除引用,即
*ptrPtr = malloc(n*sizeof(int));