我正在嘗試做一個void insertion(),但總是出現分段錯誤,請參見下文。同時,我參考了這個鏈接。
首先,我做了realloc(),然后將每個記憶體移動到 之后的下一個空間position,最后放入insertion并position增加nArraySize。
#include <stdio.h>
#include <stdlib.h>
void printArray(double array[], unsigned int size)
{
for (unsigned int i = 0; i < size; i)
{
printf("%.3f ", array[i]);
}
printf("\n");
}
void insert(double **array,
size_t *nArraySize,
double insertion,
unsigned int position)
{
//realloc the memory space first
*array = realloc(*array, (*nArraySize 1) * sizeof(double));
for(unsigned int i = nArraySize[0]-1; i >= position; i--)
{
*array[i 1] = *array[i];
}
*array[position] = insertion;
*nArraySize = 1;
}
int main()
{
double *t = calloc(4, sizeof(double));
t[0] = 0;
t[1] = 1;
t[2] = 2;
t[3] = 3;
size_t k = 4;
insert(&t, &k, 1, 1);
printf("k is %zu\n", k);
printArray(t, k);
free(t);
}
請幫忙。歡迎任何建議。
uj5u.com熱心網友回復:
由于運算子優先級,這些陳述句不正確。
*array[i 1] = *array[i];
*array[position] = insertion;
也就是說,后綴運算子的優先級高于一元運算子。
你必須寫
( *array )[i 1] = ( *array )[i];
( *array )[position] = insertion;
或者就像你已經在做的那樣
array[0][i 1] = array[0][i];
array[0][position] = insertion;
請注意,您的函式 insert 是不安全的,因為沒有檢查 position 的值是否小于或等于傳遞的陣列中的當前元素數。
還有這個for回圈
for(unsigned int i = nArraySize[0]-1; i >= position; i--)
{
( *array )[i 1] = ( *array )[i];
}
可以呼叫未定義的行為。首先,變數i總是有一個非負數。即 的值i不能為負,因為變數i具有型別unsigned int。現在讓我們假設*nArraySize等于1和position等于0; 在這種情況下,您有回圈
for(unsigned int i = 0; i >= 0; i--)
{
( *array )[i 1] = ( *array )[i];
}
并且在回圈的第一次迭代之后, 的值i將非常大,大于0。
所以最好用下面的方式重寫回圈
for(unsigned int i = *nArraySize; i > position; i--)
{
( *array )[i] = ( *array )[i-1];
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465486.html
上一篇:使用charstr[100]型別的引數并將其傳遞給較小的字串時,Gcc11 警告Wstringop-overflow
