我有一個關于從 C 中的函式回傳一個陣列的問題,我不知道為什么它總是以轉儲的代碼形式給出結果。請幫忙,真的非常感謝!我設定了一個 int list3[size3],但似乎我必須回傳一個陣列格式為 int*list3。所以我將另一個陣列設定為 list4[size3] 以將 list3 復制到 list4。但我不確定這是導致代碼轉儲的原因。如果是,請幫助我提供解決問題的建議。再次感謝你!。
#include<stdio.h>
int* merged(int[], int[], int, int);
void sort(int[], int);
int main() {
int size1;
printf("Enter list1: ");
scanf("%d", &size1);
int list1[size1];
for (int i = 0; i < size1; i ) {
scanf("%d", &list1[i]);
}
int size2;
printf("Enter list2: ");
scanf("%d", &size2);
int list2[size2];
for (int i = 0; i < size2; i ) {
scanf("%d", &list2[i]);
}
int* list3 = merged(list1, list2, size1, size2);
printf("The merged list is: ");
int size3 = size1 size2;
for (int i = 0; i < size3; i ) {
printf("%d ", list3[i]);
}
printf("\n");
}
int* merged(int list1[], int list2[], int size1, int size2) {
int list3[size1 size2];
for (int i = 0; i < size1; i ) {
list3[i] = list1[i];
}
int count = size1;
for (int i = 0; i < size2; i ) {
list3[count] = list2[i];
count ;
}
int size3 = size1 size2;
sort(list3, size3);
int* list4;
for (int i = 0; i < size3; i ) {
list4[i] = list3[i];
}
return list3;
}
void sort(int list3[], int size3) {
for (int i = 0; i < size3; i ) {
int min = list3[i];
int min_index = i;
for (int j = i 1; j < size3; j ) {
if (list3[j] < min) {
min = list3[j];
min_index = j;
}
}
if (min_index != i) {
list3[min_index] = list3[i];
list3[i] = min;
}
}
}
https://onlinegdb.com/-ChT7PA3w
uj5u.com熱心網友回復:
您merge回傳指向本地陣列的指標。它是 UB,因為該陣列在函式回傳時停止存在。所以回傳的指標參考了一個無效的物件。
int *merged(const int * restrict list1, const int * restrict list2, size_t size1, size_t size2)
{
int *result = NULL;
int l1size = size1 * !!list1, l2size = size2 * !!list2;
size_t newsize = l1size l2size;
if(newsize)
{
result = malloc(newsize * sizeof(*result));
if(result)
{
if(l1size) memcpy(result, list1, l1size * sizeof(*result));
if(l2size) memcpy(result l1size, list2, l2size * sizeof(*result));
}
}
return result;
}
void printList(const int * restrict list, size_t size)
{
if(size && list)
{
for(size_t index = 0; index < size; index )
printf("[%2zu] = =\n", index, list[index]);
}
}
void initList(int * restrict list, size_t size, int maxval)
{
if(size && list)
{
for(size_t index = 0; index < size; index )
list[index] = rand() % maxval;
}
}
int main() {
size_t size1 = 20;
size_t size2 = 10;
int list1[size1], list2[size2];
initList(list1, size1, 100);
initList(list2, size2, 100);
printList(list1, size1);
printf("----------------\n");
printList(list2, size2);
printf("----------------\n");
int *list3 = merged(list1, list2, size1, size2);
printList(list3, size2 size1);
printf("----------------\n");
free(list3);
}
還要使用正確的尺寸型別 size_t
uj5u.com熱心網友回復:
您的代碼中有幾個問題:
第一:
您正在list3從merged()函式中回傳。list3是一個區域(自動)非靜態變數,它的生命周期僅限于它的作用域,即它被宣告的塊。任何在其生命周期之外訪問它的嘗試都會導致未定義的行為。另外,list3是 VLA(可變長度陣列),您不能宣告它,static因為 VLA 不能有static存盤持續時間。另一種選擇是宣告list3為指向int它的指標并為其動態分配記憶體。
第二:
在 中merged(),您正在取消參考未初始化的指標list4。取消參考未初始化的指標是未定義的行為。分配記憶體list4,然后使用它。此外,你為什么需要list4?您將list1and復制list2到list3并list3從merged()函式回傳。我看不到任何用途list4。最好將其從merged()功能中洗掉。
因此,merged()您的代碼中只需要進行一項更改:
int*merged(int list1[], int list2[], int size1, int size2) {
int * list3 = malloc ((size1 size2) * sizeof (int));
if (list3 == NULL) {
//handle the allocation failure
//I am exiting..
printf ("Failed to allocate memory\n");
exit (EXIT_FAILURE);
}
....
....
....
sort (list3, size3);
// removed list4 from code
return list3;
}
確保釋放動態分配的記憶體。在main()函式中,你應該這樣做:
int main (void) {
....
....
....
for (int i = 0; i < size3; i ) {
printf("%d ", list3[i]);
}
printf("\n");
// free dynamically allocated memory
free (list3);
return 0;
}
幾點,我留給你去學習和實施:
您的代碼中存在一個嚴重問題,即您沒有驗證用戶輸入。嘗試給出
size1和size2作為0或負值或非常大的正值的值并檢查會發生什么。適當地處理用戶輸入。另外,考慮一下,如果您真的需要 VLA(可變長度陣列),或者您可以使用固定大小的陣列。固定大小的陣列可以是靜態的。實施部分有改進的余地。嘗試找出它們并進行改進。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393533.html
