完整代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printarray(int* array, int arraysize){
for (int i = 0; i<arraysize; i ){
printf("%d\n", *array);
array ;
}
}
void printStrArray(char** array, int arraysize){
int j = 0;
for (int i = 0; i<arraysize; i ){
j = 0;
while (array[i][j] != '\0'){
printf("%c", array[i][j]);
j ;
}
printf("\n");
}
}
int isStringInArray(char* string, char** stringArray, int arrayLen){ // returns 1 if string is contained in the array.
for (int i = 0; i < arrayLen; i ){
if (strcmp(string, stringArray[i]) == 0){
//printf("%s is equal to %s %d\n", string, stringArray[i], i);
return 1;
}
}
return 0;
}
int lenstring(char* string){ // checks string length (works only if string has null character at the end.)
char currchar = string[0];
int strlen = 0;
while (currchar != '\0'){
strlen ;
currchar = string[strlen];
}
return strlen;
}
char** riassemble(char* stringa){
char** riassembleds = calloc(1, sizeof(char*));
char* charLen = malloc(sizeof(char));
riassembleds[0] = charLen;
int riassembledLen = 1;
int stringalen = lenstring(stringa);
char tempstring[stringalen];
strcpy(tempstring, stringa);
for (int i = 0; i < stringalen; i ){
for (int j = 0; j < stringalen; j ){
tempstring[i] = stringa[j];
tempstring[j] = stringa[i];
//printf("%s\n", tempstring);
if (isStringInArray(tempstring, riassembleds, riassembledLen) == 0){
riassembleds = realloc(riassembleds, (riassembledLen 1)*sizeof(char*));
riassembledLen ;
riassembleds[riassembledLen-1] = calloc(stringalen, sizeof(char));
printf("%p\n", riassembleds[riassembledLen-1]);
strcpy(riassembleds[riassembledLen-1], tempstring);
}
strcpy(tempstring, stringa);
}
}
*charLen = (char)riassembledLen;
riassembleds[0] = charLen; /*return the array with the length of the it casted into a char pointer as the first element*/
return riassembleds;
}
int main(int argc, char *argv[]){
char** array = riassemble("ciao");
int arraylen = (int)(*(array[0]));
printf("\n%d\n", arraylen);
printStrArray(array, arraylen);
for (int i=0; i<arraylen; i ) {
free(array[i]);
}
free(array);
return 0;
}
我正在創建一個函式,該函式回傳一個指向 char 的指標陣列,其中第一個元素是一個指向轉換為 char 的陣列長度的指標。
當我嘗試釋放陣列中的元素時
char** array = riassemble("ciao"); /*Creates the array*/
int arraylen = (int)(*(array[0])); /*Gets the length*/
for (int i=0; i<arraylen; i ) {
free(array[i]);
}
程式在嘗試釋放此處定義的陣列的第二個元素后崩潰:
riassembleds = realloc(riassembleds, (riassembledLen 1)*sizeof(char*));
riassembledLen ;
riassembleds[riassembledLen-1] = calloc(stringalen, sizeof(char));
printf("%p\n", riassembleds[riassembledLen-1]);
strcpy(riassembleds[riassembledLen-1], tempstring);
我真的不明白為什么會這樣,我注意到的一件事是,如果我列印它試圖釋放的指標,它們與我在 riassemble 函式中分配它們后立即列印它們時不同,但除了我不知道我做錯了什么。
編輯:我錯了他們不一樣的事實,他們實際上是,我很困惑。
uj5u.com熱心網友回復:
您的函式lenstring將回傳不帶終止空字符的字串的長度。
因此,線
char tempstring[stringalen];
tempstring將創建一個大小足以存盤stringa 沒有終止空字符的字串的陣列。
但是,函式呼叫
strcpy(tempstring, stringa);
要求它tempstring足夠大以存盤stringa 終止空字符。因此,您正在越界寫入tempstring,呼叫未定義的行為。
為了解決這個問題,我建議您更改行
char tempstring[stringalen];
至:
char tempstring[stringalen 1];
線
riassembleds[riassembledLen-1] = calloc(stringalen, sizeof(char));
有同樣的問題,因為它只分配足夠的空間而沒有終止空字符,這會導致該行
strcpy(riassembleds[riassembledLen-1], tempstring);
出于同樣的原因呼叫未定義的行為。
因此,線
riassembleds[riassembledLen-1] = calloc(stringalen, sizeof(char));
應該改成
riassembleds[riassembledLen-1] = calloc(stringalen 1, sizeof(char));
通過在您的程式中使用AddressSanitizer ,我能夠很容易地找到這些錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/537262.html
標籤:数组C指针分配
上一篇:結構指標陣列的歸并排序
下一篇:投射匿名二維陣列
