我需要在 C 中動態填充一個字串陣列。這是我的代碼示例。編譯良好,分段錯誤。有沒有可能實作這個功能?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_FILE_NAME_LENGTH 255
void loadList(char*** files,int *filesSize);
int main (int argc, char *argv[])
{
char** files;
int filesSize=-1;
loadList(&files, &filesSize);
//printf("filesize= %d\n",filesSize );
for(int i=0;i< filesSize;i ) printf("%s\n", files[i]);
free(files);
return 0;
}
////////////////////////////////////////////////////////////////////////////////
void loadList(char*** files,int *filesSize){
*filesSize=3;
//some arry for the example
char *values[] = {"100.dat", "150.dat", "200.dat"};
for(int i=0;i< *filesSize;i ){
*files=(char**) realloc(*files,(i 1) * sizeof(**files));
*files[i]=malloc((MAX_FILE_NAME_LENGTH 1) * sizeof(char*));
strcpy(*files[i],values[i]);
printf("%s\n", files[i]);
}
}
uj5u.com熱心網友回復:
在*files = (char **)realloc(*files, (i 1) * sizeof(**files));您依靠*files指向已分配的記憶體或 NULL. 兩者都不是真的。
*files[i]也應該是(*files)[i]因為運算子優先級。
您還忘記free了在回圈內進行的分配。修復程式可能如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_FILE_NAME_LENGTH 255
void loadList(char ***files, size_t *filesSize) {
// some array for the example
const char *values[] = {"100.dat", "150.dat", "200.dat"};
*filesSize = sizeof values / sizeof *values;
*files = NULL; // crucial for first realloc
for (int i = 0; i < *filesSize; i ) {
*files = realloc(*files, (i 1) * sizeof **files);
// I'm using strlen here instead of MAX_FILE_NAME_LENGTH but
// you can change that back if you want more space than the
// strings really need.
(*files)[i] = malloc((strlen(values[i]) 1) * sizeof(char));
strcpy((*files)[i], values[i]);
}
}
int main(int argc, char *argv[]) {
char **files;
size_t filesSize = -1;
loadList(&files, &filesSize);
// printf("filesize= %d\n",filesSize );
for (int i = 0; i < filesSize; i ) printf("%s\n", files[i]);
// free what was allocated in the loop
for (int i = 0; i < filesSize; i ) free(files[i]);
free(files);
return 0;
}
files = realloc(*files, ...但請注意:如果realloc失敗,您將丟失原始指標并且無法恢復。將回傳值分配給臨時變數并檢查它是否有效或從函式回傳(設定*filesSize為 后i)或退出程式如果*files == NULL。
uj5u.com熱心網友回復:
規則是free每次xalloc呼叫都必須存在a 。并且使用回傳值可以避免額外的間接級別。
如果您只想為每個字串分配已使用的大小,則第一種方法是回傳一個指標陣列:
char** loadList(int* filesSize);
int main(int argc, char* argv[])
{
char** files;
int filesSize = -1;
files = loadList(&filesSize);
//printf("filesize= %d\n",filesSize );
for (int i = 0; i < filesSize; i ) printf("%s\n", files[i]);
for (int i = 0; i < filesSize; i ) free(files[i]);
free(files);
return 0;
}
////////////////////////////////////////////////////////////////////////////////
char ** loadList(int* filesSize) {
//some arry for the example
char* values[] = { "100.dat", "150.dat", "200.dat" };
*filesSize = sizeof(values) / sizeof(values[0]);
char** files = malloc(*filesSize * sizeof(*files));
for (int i = 0; i < *filesSize; i ) {
files[i] = strdup(values[i]);
printf("%s\n", files[i]);
}
return files;
}
或者,如果您希望所有檔案名都具有最大大小,最好構建一個 2D 陣列以具有一個單一的分配/解除分配步驟:
#define MAX_FILE_NAME_LENGTH 255
typedef char FileName[MAX_FILE_NAME_LENGTH];
FileName* loadList(int* filesSize);
int main(int argc, char* argv[])
{
int filesSize = -1;
FileName *files = loadList(&filesSize);
//printf("filesize= %d\n",filesSize );
for (int i = 0; i < filesSize; i ) printf("%s\n", files[i]);
free(files);
return 0;
}
////////////////////////////////////////////////////////////////////////////////
FileName* loadList(int* filesSize) {
//some arry for the example
char* values[] = { "100.dat", "150.dat", "200.dat" };
*filesSize = sizeof(values) / sizeof(values[0]);
FileName *files = malloc(*filesSize * sizeof(*files));
for (int i = 0; i < *filesSize; i ) {
strcpy(files[i],values[i]);
printf("%s\n", files[i]);
}
return files;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/403629.html
標籤:
上一篇:從字串顫振中呼叫一個類
