2017-07-23 90 views
0

我想在C中編寫一個函數,它需要兩個字符數組,交替地將數組元素組合成一個新數組,然後返回一個指向新數組的指針。將兩個給定數組交替組合成單個數組的函數

我的程序編譯得很好,但每次程序運行時都會產生不正確的不同輸出。

如果有人能幫忙指出我要出錯的地方,我會非常感激。

#include <stdio.h> 
#include <stdlib.h> 
char* altCombine(char[], char[], int, int); 

int main(int argc, char** argv){ 
    char arr1[4] = {'e','f','g', 'h'}; 
    char arr2[4] = {'a','b','c','d'}; 
    int size1 = 4; 
    int size2 = 4; 
    char* altArr; 
    altArr = altCombine(arr1, arr2, size1, size2); 
    for(int i = 0; i < 8; i++){ 
     printf("%c \n", altArr[i]); 
    } 

    return 0; 
} 

char* altCombine(char arr1[], char arr2[], int size1, int size2){ 
    int i = 0, a = 0, b = 0; 
    int totalSize = (size1 + size2); 
    char* nArr = malloc(sizeof(char) * totalSize); 
    char newArr[totalSize]; 
    while(i < totalSize){ 
     if(a < size1){ 
      newArr[i] = arr1[a]; 
      i++; 
      a++;  
     } 
     if(b < size2){ 
      newArr[i] = arr2[b]; 
      i++; 
      b++; 
     } 
    }  
    nArr = &newArr[0]; 
    return nArr;  
} 
+0

'NARR = newArr [0]; return nArr;' - >'return memcpy(nArr,newArr,totalSize);' – BLUEPIXY

+0

'nArr =&newArr [0];''newArr'對'altCombine'是本地的,並且* out_of_scope *(並且釋放內存重複使用)。所以你的'nArr'指針指向返回'main'時不再存在的內存。 'memcpy(nArr,newArr,totalsize);'而不是'nArr =&newArr [0];'---什麼@BLUEPIXY說... –

回答

2

這樣做

char* nArr = malloc(sizeof(char) * totalSize); 

你是在正確的軌道上。你在堆上分配你需要的空間,所以內存保持有效直到明確釋放。

char newArr[totalSize]; 

,另一方面分配函數的棧上newArr,所以鏡頭被刪掉了函數返回。

更進一步,因爲你有nArr你只是不需要newArr

所以敲定你了由nArr全部更換newArr的方法,並刪除此行

nArr = &newArr[0]; 

和你做。


正如一些評論所提到已經你或者可以通過使用

memcpy(nArr, newArr, sizeof newArr); 

,而不是

nArr = &newArr[0]; 

後者語句不照搬照抄newArr的內容到nArr點數組的內容,但只是分配給指針nArr添加newArr的第一個元素。這不會對你有所幫助,因爲當函數返回時,這個地址下的值將被釋放(參見上文)。

同樣覆蓋nArr的值會將先前調用分配的內存泄漏到malloc()


無關您的問題:所有這些int S的關係最好是size_t秒。

+0

非常感謝您花時間回答!我一整天都在撓頭。你已經度過了我的夜晚! – avryn

0

您已經分配的內存,使您可以使用相同的字符數組存儲結果,然後返回它 這可以幫助你

#include <stdio.h> 
#include <stdlib.h> 
char* altCombine(char[], char[], int, int); 

int main(int argc, char** argv){ 
    char arr1[4] = {'e','f','g', 'h'}; 
    char arr2[4] = {'a','b','c','d'}; 
    int size1 = 4; 
    int size2 = 4; 
    char* altArr; 
    altArr = altCombine(arr1, arr2, size1, size2); 
    for(int i = 0; i < 8; i++){ 
     printf("%c \n", *(altArr+i)); 
    } 

    return 0; 
} 

char* altCombine(char* arr1, char* arr2, int size1, int size2){ 
    int i = 0, a = 0, b = 0; 
    int totalSize = (size1 + size2); 
    char* nArr =(char*) malloc(sizeof(char) * totalSize); 

    while(i < totalSize){ 
     if(a < size1){ 
      nArr[i] = arr1[a];//nArr used instead of newArr 
      i++; 
      a++;  
     } 
     if(b < size2){ 
      nArr[i] = arr2[b];//nArr used instead of newArr 
      i++; 
      b++; 
     } 
    }  

    return nArr; //char pointer returned 
} 
+0

不需要在C中投射「空指針」。 – alk

相關問題