我有一個整數元素陣列,每當我嘗試將其中一個元素的(值)復制到整數指標時,都會收到分段錯誤。分段錯誤來自整數指標,因為如果我使用常規整數(而不是 int*),則沒有分段錯誤。我試圖弄清楚為什么在存盤整數值時會出現段錯誤,例如*max = arr[0]. 有人可以澄清為什么在 C 中這樣做是非法的嗎?
int main (int argc, char **argv) {
int arr[] = {1000, 11, 445, 1, 330, 3000};
int len = sizeof(arr)/sizeof(arr[0]);
int *min;
int *max;
if (arr[0] > arr[1]) {
*max = arr[0]; <----Seg fault here.
*min = arr[1];
}else {
*min = arr[0];
*max = arr[1];
}
// Calculate min and max in array and stores those values in `min` and `max`
calculateMinMax (arr, len, min, max);
printf("Min Value:%d", *min);
printf("Max Value:%d", *max);
return 0;
}
GDB 中的結果
Program received signal SIGSEGV, Segmentation fault.
0x00005555555552bf in main (argc=1, argv=0x7fffffffe208) at minmaxarray.c:32
32 *max = arr[0];
(gdb)
uj5u.com熱心網友回復:
當您使用指標時,您必須始終牢記指標本身與指標指向的值之間的區別。在您將指標本身設定為指向某個地方之前,“指標指向的值”的概念是沒有意義的。
對于指標變數int *max,當你說
max = ...
你正在設定指標本身,當你說
*max = ...
您正在設定指標指向的值。
但是在您發布的代碼中,您有類似的行
*max = arr[0];
在將指標設定為指向任何位置之前,您正在嘗試設定指標指向的值。正如我所說,這是沒有意義的,它往往會導致分段錯誤或其他此類致命錯誤。
正如其他人發布的那樣,如果您想要min并max指向陣列中的某些元素,您需要類似
max = &arr[0];
如果您只想*max成為從陣列中獲取的值,那就是
*max = arr[0];
可能會,但首先,你必須確保max指向某個地方。你可以做
int temporary_storage_for_max;
max = &temporary_storage_for_max;
之后的線條像
*max = arr[0];
會作業。但在那種情況下,使用指標就太愚蠢了。在這種情況下,你不妨宣告max為一個普通的 int:
int max;
然后做類似的事情
max = a[0];
但我猜你確實想要min并max成為指標,在這種情況下,如前所述,
max = &arr[0];
是要走的路。
您的calculateMinMax功能可能也需要作業,但是由于您沒有證明很難說出它可能需要什么。(可以想象,如果最小/最大查找作業并且calculateMinMax做得正確,那么您根本不需要這些初始分配。)minmax
uj5u.com熱心網友回復:
您希望將max而&arr[0]不是陣列中第一項的值分配給指標中的地址,因為指標的值當前未定義。
IE
max = &arr[0];
min = &arr[1];
等等。
uj5u.com熱心網友回復:
你的間接是錯誤的,最終放錯了地方。神秘函式calculateMinMax 似乎希望計算給定序列的最小值和最大值,并將它們的結果存盤在呼叫者地址提供的外引數中。
int main (int argc, char **argv) {
int arr[] = {1000, 11, 445, 1, 330, 3000};
int len = sizeof(arr)/sizeof(arr[0]);
// initialize these if you want, but it shouldn't
// be necessary if calculateMinMax does its job
// correctly
int min;
int max;
// note last two arguments passed are the *addresses*
// of our output arguments, in which to store the
// final min/max values from the sequence.
calculateMinMax (arr, len, &min, &max);
printf("Min Value:%d", min);
printf("Max Value:%d", max);
return 0;
}
不要讓這變得比它需要的更難。指標指向事物。你的沒有被指定為指向任何東西。執行上述操作與此同義:
int main (int argc, char **argv) {
int arr[] = {1000, 11, 445, 1, 330, 3000};
int len = sizeof(arr)/sizeof(arr[0]);
int min;
int max;
int *pmin = &min;
int *pmax = &max;
calculateMinMax (arr, len, pmin, pmax);
printf("Min Value:%d", min);
printf("Max Value:%d", max);
return 0;
}
uj5u.com熱心網友回復:
此代碼段
if (arr[0] > arr[1]) {
*max = arr[0]; <----Seg fault here.
*min = arr[1];
}else {
*min = arr[0];
*max = arr[1];
}
沒有意義。指標max和min未初始化。因此取消參考它們會呼叫未定義的行為。
此外,您具有calculateMinMax必須確定陣列中最大和最小元素的功能。
所以不要寫上面的代碼片段
calculateMinMax (arr, len, &min, &max);
請注意,您需要通過指向指標的參考來傳遞指標min和max函式。否則,該函式將處理指標值的副本,并且更改副本不會更改原始指標。
該函式可以通過以下方式宣告和定義
void calculateMinMax( const int a[], size_t n, int **min, int **max )
{
*min = ( int * )a;
*max = ( int * )a;
for ( size_t i = 1; i < n; i )
{
if ( **max < a[i] )
{
*max = ( int * )( a i );
}
else if ( a[i] < **min )
{
*min = ( int * )( a i );
}
}
}
這是一個演示程式。
#include <stdio.h>
void calculateMinMax( const int a[], size_t n, int **min, int **max )
{
*min = ( int * )a;
*max = ( int * )a;
for (size_t i = 1; i < n; i )
{
if (**max < a[i])
{
*max = ( int * )( a i );
}
else if (a[i] < **min)
{
*min = ( int * )( a i );
}
}
}
int main( void )
{
int arr[] = { 1000, 11, 445, 1, 330, 3000 };
size_t len = sizeof( arr ) / sizeof( arr[0] );
int *min;
int *max;
calculateMinMax( arr, len, &min, &max );
printf( "Min Value: %d\n", *min );
printf( "Max Value: %d\n", *max );
}
程式輸出為
Min Value: 1
Max Value: 3000
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430159.html
