這個問題在這里已經有了答案: 如何在 C 中的函式中傳遞二維陣列(矩陣)? (4 個回答) 7 小時前關閉。
我在函式arrayConstruction中有一個二維陣列,我想將它交給主函式以在那里使用它,它可以作業,但在那里檢索到的值完全不一致。貝婁是我試圖這樣做的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <unistd.h>
#include <ctype.h>
void arrayConstruction(int nb_row, char** result, int (*givenArr)[2]){
const char * separator = " ";
char * strToken;
char *outt;
char *end;
/* 1D array */
int arrBuf[nb_row*2];
/* 2D array */
int (*myArr)[2] = (int(*)[2])arrBuf;
int i;
outt = strdup(*result);
/* Store numbers as 1D array */
strToken = strtok ( outt, separator );
for (i = 0; i < nb_row*2 && strToken != NULL ; i ) {
arrBuf[i] = (int)strtol(strToken, &end, 10);
strToken = strtok ( NULL, separator);
}
givenArr = myArr;
}
int main(int argc, char **argv)
{
char *result =
" 2 1\n\
3 2\n\
5 2\n\
5 4\n\
6 1\n\
6 2\n\
7 1\n\
7 3\n\
7 4\n\
8 1\n\
";
int nb_rows = 10;
int emptyArr[][2] ={0};
arrayConstruction(nb_rows, &result, emptyArr);
int i;
for (i = 0; i < nb_rows; i ) {
printf("%d---%d\n", emptyArr[i][0], emptyArr[i][1]);
}
}
我試圖訪問它創建一個指向陣列的指標,但它不是正確的值。
uj5u.com熱心網友回復:
線
givenArr = myArr;
在函式arrayConstruction中只會改變區域變數的值givenArr,它是一個指標。它不會emptyArr以任何方式更改原始陣列,因此函式main無法訪問新值。
即使函式main確實以某種方式訪問??了新值,該值對 也是無用的main,因為該值是一個懸空指標,原因如下:
運算式myArr是指向陣列第一個元素的指標arrBuf,即&arrBuf[0]。但是,一旦函式回傳,整個陣列arrBuf將不復存在arrayConstruction,因為它是一個具有自動生命周期的本地陣列。因此,函式一回傳,指標就會指向一個不存在的物件,所以指標是沒用的。
因此,將資料存盤在函式本地的陣列中是沒有意義的arrayConstruction。在函式內部宣告陣列更有意義main,使其生命周期與函式一樣長main。
在您的 functionmain中,您使用的是 2D 陣列,但在 functionarrayConstruction中,您同時使用了 2D 陣列和 1D 陣列。由于在普通 ISO C 中不允許嘗試將 2D 陣列作為 1D 陣列訪問(盡管它適用于大多數平臺),因此最好決定是要使用 2D 陣列還是 1D 陣列,并在你的整個程式。
這是一個使用一維陣列的作業示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void arrayConstruction( int *nb_elements, int givenArr[], char *input )
{
const char * separator = " ";
char * strToken;
char *outt;
int i;
outt = strdup( input );
strToken = strtok ( outt, separator );
for ( i = 0; i < *nb_elements && strToken != NULL; i )
{
givenArr[i] = strtol( strToken, NULL, 10 );
strToken = strtok ( NULL, separator);
}
free( outt );
*nb_elements = i;
}
int main( void )
{
char *input =
" 2 1\n"
" 3 2\n"
" 5 2\n"
" 5 4\n"
" 6 1\n"
" 6 2\n"
" 7 1\n"
" 7 3\n"
" 7 4\n"
" 8 1\n"
;
int arr[20] = {0};
int nb_elements = sizeof arr / sizeof *arr;
arrayConstruction( &nb_elements, arr, input );
for ( int i = 0; i < nb_elements / 2; i )
{
printf( "%d---%d\n", arr[i*2 0], arr[i*2 1] );
}
}
請注意,我free在 using 之后呼叫strdup,您在代碼中沒有這樣做,導致記憶體泄漏。
該程式具有以下輸出:
2---1
3---2
5---2
5---4
6---1
6---2
7---1
7---3
7---4
8---1
這是一個使用二維陣列的作業示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void arrayConstruction( int *nb_rows, int givenArr[][2], char *input )
{
const char * separator = " ";
char * strToken;
char *outt;
int i;
outt = strdup( input );
strToken = strtok ( outt, separator );
for ( i = 0; i < *nb_rows && strToken != NULL; i )
{
for ( int j = 0; j < 2 && strToken != NULL; j )
{
givenArr[i][j] = strtol( strToken, NULL, 10 );
strToken = strtok( NULL, separator);
}
}
free( outt );
*nb_rows = i;
}
int main( void )
{
char *input =
" 2 1\n"
" 3 2\n"
" 5 2\n"
" 5 4\n"
" 6 1\n"
" 6 2\n"
" 7 1\n"
" 7 3\n"
" 7 4\n"
" 8 1\n"
;
int arr[10][2] = {0};
int nb_rows = sizeof arr / sizeof *arr;
arrayConstruction( &nb_rows, arr, input );
for ( int i = 0; i < nb_rows; i )
{
printf( "%d---%d\n", arr[i][0], arr[i][1] );
}
}
該程式與另一個程式具有相同的輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/532808.html
標籤:数组C
