Итак, я выполнял это упражнение:
Напишите функцию C void вхождения (char* s, char c, char*** occp, int* n), которая для заданной строки s и char c подсчитывает количество вхождений char c в строке s и возвращает это число в n и возвращает в occp адрес нового массива char, который содержит адреса каждого c вхождения в s
основной образец:
#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
РЕДАКТИРОВАТЬ: скопировал правильную функцию, лол
(*n)*sizeof(char*)
байт (не используяsizeof(char**))
. - person nobody   schedule 21.05.2014