所以,我在做這個練習:realloc()浪費了一大堆空間,我做錯了什麼?
編寫一個C語言函數void出現(字符* S,焦炭C,焦*** OCCP, INT * N),給定一個字符串s和一個char C,計數的 出現在字符串s炭數c,返回OCCP炭的新數組,它包含每個C 發生s中不會忽略的ADRESS中n表示數,並返回在
主要樣品:
#include <stdio.h>
int main(){
int i, n;
char** occ;
occorrenze("engineering", 'n', &occ, &n);
for (i=0; i<n; ++i) printf("%s\n", occ[i]); // prints ngineering neering ng
free(occ);
}
最初我寫的功能是這樣的:
void occurrences(char* s1, char c, char*** s, int* n){
*n=0;
char* arr[2];
int length=strlen(s1);
int i;
for(i=0; i<length; i++){
if(s1[i]==c)(*n)++;
}
*s=(malloc((*n)*sizeof(char**)));
int a=0;
for(i=0; i<length; i++){
if(s1[i]==c){
(*s)[a]= &s1[i];
a++;
}
}
}
效果不錯,但我想嘗試並重新寫迭代字符串只是一個時間。我想用的realloc()函數,我從來沒有使用過,最終我來到了這一點:
void occurrences(char* s1, char c, char*** s, int* n){
*n=0;
*s=malloc(0);
char* arr[2];
int length=strlen(s1);
int i,a=0;
for(i=0; i<length; i++){
if(s1[i]==c){
(*n)++;
*s=realloc(*s,(*n)*sizeof(char**));
(*s)[a]= &s1[i];
a++;
}
}
}
這一次似乎也很好的工作,但後來我跑Valgrind的:
==4893== HEAP SUMMARY:
==4893== in use at exit: 0 bytes in 0 blocks
==4893== total heap usage: 4 allocs, 4 frees, 48 bytes allocated
==4893==
==4893== All heap blocks were freed -- no leaks are possible
==4893==
==4893== For counts of detected and suppressed errors, rerun with: -v
==4893== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
48字節分配?它應該是24個字節,對吧? 總堆大小爲8 * n!而不是8 * N個......我想我失去了一些東西XD
編輯:複製權函數笑
爲什麼你認爲它應該是24? – nos
@Andrew Medico複製/粘貼錯誤,很抱歉! – Atlas80b
32位或64位系統? 64位系統使用8個字節的指針,這將使48個。 – DoxyLover