我正在尝试在不使用数组表示法的情况下遍历双指针。我的指导老师给了我这些指导方针。
In.h文件:
int** A, B, C;
在.c文件中
void initNumbers() {
int** a = A;
int** b = B;
int** c = C;
int* p;// = *a;
int* q;// = *b;
int* r;// = *c;
for (int i = 0; i < 10; i++) {
p = *a;
q = *b;
r = *c;
for (int j = 0; j < 10; j++) {
*r = rand() % 50;
*p = rand() % 50;
*q = rand() % 50;
p++;
q++;
r++;
}
a++;
b++;
c++;
}
}
我已通过分配内存。
void initNumSpace() {
A = malloc(sizeof(int*) * 10);
B = malloc(sizeof(int*) * 10);
C = malloc(sizeof(int*) * 10);
int** a = A;
int** b = B;
int** c = C;
for (int i = 0; i < 10; i++) {
a = malloc(sizeof(int) * 10);
b = malloc(sizeof(int) * 10);
c = malloc(sizeof(int) * 10);
a++;
b++;
c++;
}
}
该代码没有语法错误,但在initNumbers的嵌入循环的第一次迭代中存在分段错误。为什么会发生这种情况?在没有数组表示法(例如索引或偏移值(的情况下迭代指针数组的最佳方式是什么。
您的代码有一些问题。
首先,不应该在头文件中定义变量;您只应声明它们。也就是说,如果你想声明一个整数N,那么你不应该写int N;
,而是写extern int N;
,然后去你的源文件写int N;
来定义它。C(和C++(有多声明一定义规则:你可以随心所欲地声明一些东西(你可以在源文件中只写一次‘extern int A;five times in a row and the compiler won't mind), but you have to define each variable and function exactly once (you should write
int A;’(。
其次,头文件有一个小问题。在C中,写入int** A,B,C;
与写入int **A;int B;int C;
相同。A
是双指针,但B
和C
是整数。因此,您应该编写int **A,**B,**C;
(或者更好的做法是,将每一个都写在单独的一行上(。
您的代码现在应该是这样的:
标头:
int** A;
int** B;
int** C;
来源:
void initNumSpace() {
A = malloc(sizeof(int*) * 10);
B = malloc(sizeof(int*) * 10);
C = malloc(sizeof(int*) * 10);
int** a = A;
int** b = B;
int** c = C;
for (int i = 0; i < 10; i++) {
//you should dereference these btw
*a = malloc(sizeof(int) * 10);
*b = malloc(sizeof(int) * 10);
*c = malloc(sizeof(int) * 10);
a++;
b++;
c++;
}
}
void initNumbers() {
int** a = A;
int** b = B;
int** c = C;
int* p;// = *a;
int* q;// = *b;
int* r;// = *c;
for (int i = 0; i < 10; i++) {
p = *a;
q = *b;
r = *c;
for (int j = 0; j < 10; j++) {
*r = rand() % 50;
*p = rand() % 50;
*q = rand() % 50;
p++;
q++;
r++;
}
a++;
b++;
c++;
}
}
PS:你为什么这么做?这并没有错,但它真的很复杂,很难阅读。为什么不想使用数组索引([]
(。
错误在init函数中。双指针被设置为新分配的空间,但指针数组A没有被设置为A的值。试试这个:
for (int i = 0; i < 10; i++) {
*a = malloc(sizeof(int) * 10);
*b = malloc(sizeof(int) * 10);
*c = malloc(sizeof(int) * 10);
a++;
b++;
c++;
}
更新:您还必须将B和C的类型更改为int*或int**。否则,这可能无法在非32位的系统上工作。(void*的大小必须为int,索引也必须相同才能工作(。在这种情况下使用int是一种责任,因为int的大小在不同的系统上定义不同,并且它与void的大小不一致。您可以使用stdint.h中的int32_t等来获得更好的兼容性。