为什么 ArrayPointer 给出分段默认值?
Why ArrayPointer gives segmentation default?
在我的代码中,当我将 void myFunc(int arrayInput[3][2])
更改为 void myFunc(int **arrayInput)
时,第 5 行出现分段错误,为什么?如何使用数组指针而不是固定尺寸的数组?谢谢!
#include <stdio.h>
const int myArray[3][2] = {{1, 2}, {3, 4}, {5, 6}};
int main2() {
myFunc(myArray);
return 0;
}
void myFunc(int arrayInput[3][2]) {
printf("Line 1: %x\n",arrayInput);
printf("Line 2: %x\n",arrayInput + 1);
printf("Line 3: %x\n",*arrayInput);
printf("Line 4: %x\n",*(arrayInput+1));
printf("Line 5: %d\n",*(*(arrayInput + 1) + 0));
}
双指针不代表二维数组。
你可以尝试做的是像这样动态分配你的二维数组
#include <stdio.h>
#include <stdlib.h>
void myFunc(int** array);
int main() {
int** myarray = malloc(3*sizeof(int*));
for(int x = 0; x < 3;++x){
myarray[x] = malloc(2*sizeof(int));
}
for(int col = 0; col < 3; ++ col){
for(int row = 0; row < 2; ++row){
myarray[col][row] = col+row;
}
}
myFunc(myarray);
for(int x = 0; x < 3;++x){
free(myarray[x]);
}
free(myarray);
return 0;
}
void myFunc(int** arrayInput) {
printf("Line 1: %p\n",arrayInput);
printf("Line 2: %p\n",arrayInput + 1);
printf("Line 3: %p\n",*arrayInput);
printf("Line 4: %p\n",*(arrayInput+1));
printf("Line 5: %d\n",*(*(arrayInput + 1) + 0));
}
这里有一点关于为什么
#include <stdio.h>
int myArray[3][2] = { { 1, 2}, { 3, 4}, { 5, 6}};
void myFunc ( int array[3][2], int **ptrptr) {
printf ( " : %p **: %p\n", (void*)array, (void*)ptrptr);
printf ( "[0]: %p **: %p\n", (void*)*(array + 0), (void*)*(ptrptr + 0));
printf ( "[1]: %p **: %p\n", (void*)*(array + 1), (void*)*(ptrptr + 1));
printf ( "[1][0]: %d\n",*(*(array + 1) + 0));
}
int main ( void) {
printf ( "myArray: %p\n", (void*)&myArray);
myFunc ( myArray, myArray);
return 0;
}
此程序将 myArray
作为数组和指向指针的指针传递。
编译器警告我指向指针的指针是不兼容的类型。
输出:
myArray: 0x55d518e9e010
: 0x55d518e9e010 **: 0x55d518e9e010
[0]: 0x55d518e9e010 **: 0x200000001
[1]: 0x55d518e9e018 **: 0x400000003
[1][0]: 3
第一行给出main
中myArray
的地址。
第二行显示在myFunc
中,两个指针都指向myArray
.
下一行显示了类型不兼容的原因。 *(array + 0)
指向一个有效地址。 *(ptrptr + 0)
指向无效地址。它不是另一个指针中的地址,而是将 myArray[0]
的两个整数显示为小端系统上的地址。
最后一行显示 array
的取消引用地址处的值。尝试取消引用 ptrptr
中的无效地址会导致灾难。
在我的代码中,当我将 void myFunc(int arrayInput[3][2])
更改为 void myFunc(int **arrayInput)
时,第 5 行出现分段错误,为什么?如何使用数组指针而不是固定尺寸的数组?谢谢!
#include <stdio.h>
const int myArray[3][2] = {{1, 2}, {3, 4}, {5, 6}};
int main2() {
myFunc(myArray);
return 0;
}
void myFunc(int arrayInput[3][2]) {
printf("Line 1: %x\n",arrayInput);
printf("Line 2: %x\n",arrayInput + 1);
printf("Line 3: %x\n",*arrayInput);
printf("Line 4: %x\n",*(arrayInput+1));
printf("Line 5: %d\n",*(*(arrayInput + 1) + 0));
}
双指针不代表二维数组。 你可以尝试做的是像这样动态分配你的二维数组
#include <stdio.h>
#include <stdlib.h>
void myFunc(int** array);
int main() {
int** myarray = malloc(3*sizeof(int*));
for(int x = 0; x < 3;++x){
myarray[x] = malloc(2*sizeof(int));
}
for(int col = 0; col < 3; ++ col){
for(int row = 0; row < 2; ++row){
myarray[col][row] = col+row;
}
}
myFunc(myarray);
for(int x = 0; x < 3;++x){
free(myarray[x]);
}
free(myarray);
return 0;
}
void myFunc(int** arrayInput) {
printf("Line 1: %p\n",arrayInput);
printf("Line 2: %p\n",arrayInput + 1);
printf("Line 3: %p\n",*arrayInput);
printf("Line 4: %p\n",*(arrayInput+1));
printf("Line 5: %d\n",*(*(arrayInput + 1) + 0));
}
这里有一点关于为什么
#include <stdio.h>
int myArray[3][2] = { { 1, 2}, { 3, 4}, { 5, 6}};
void myFunc ( int array[3][2], int **ptrptr) {
printf ( " : %p **: %p\n", (void*)array, (void*)ptrptr);
printf ( "[0]: %p **: %p\n", (void*)*(array + 0), (void*)*(ptrptr + 0));
printf ( "[1]: %p **: %p\n", (void*)*(array + 1), (void*)*(ptrptr + 1));
printf ( "[1][0]: %d\n",*(*(array + 1) + 0));
}
int main ( void) {
printf ( "myArray: %p\n", (void*)&myArray);
myFunc ( myArray, myArray);
return 0;
}
此程序将 myArray
作为数组和指向指针的指针传递。
编译器警告我指向指针的指针是不兼容的类型。
输出:
myArray: 0x55d518e9e010
: 0x55d518e9e010 **: 0x55d518e9e010
[0]: 0x55d518e9e010 **: 0x200000001
[1]: 0x55d518e9e018 **: 0x400000003
[1][0]: 3
第一行给出main
中myArray
的地址。
第二行显示在myFunc
中,两个指针都指向myArray
.
下一行显示了类型不兼容的原因。 *(array + 0)
指向一个有效地址。 *(ptrptr + 0)
指向无效地址。它不是另一个指针中的地址,而是将 myArray[0]
的两个整数显示为小端系统上的地址。
最后一行显示 array
的取消引用地址处的值。尝试取消引用 ptrptr
中的无效地址会导致灾难。