gpt4 book ai didi

c - 动态字符数组 - 堆栈

转载 作者:行者123 更新时间:2023-11-30 20:47:09 29 4
gpt4 key购买 nike

我需要一个字符数组,其中包含基于特定文件夹中文件数量的动态数量的字符数组。我能够通过初始化 char (*FullPathNames)[MAX_FILENAME_AND_PATHNAME_LENGTH] 来完成此操作,然后使用 FullPathNames = malloc( sizeof(*FullPathNames) * NumOfFiles * MAX_FILENAME_AND_PATHNAME_LENGTH ) ) 在我知道另一个函数发现了多少个文件(我没有提供)之后。这个过程完美无缺。

我只能使用 ANSI C;我专门使用 LabWindows CVI 8.1 来编译我的代码。我无法使用任何其他编译器。下面的代码正在做我想做的事情。我可以使用以下代码轻松填充该数组:

Strcpy(FullPathNames[0],”Test Word”);
char (*FullPathNames)[MAX_FILENAME_AND_PATHNAME_LENGTH];
size_t Size;
NumOfFiles = NumberOfUserFiles(“*.txt”, “C:\\ProgramData” );
FullPathNames = malloc( sizeof(*FullPathNames) * NumOfFiles * MAX_FILENAME_AND_PATHNAME_LENGTH ) );
Size = sizeof(*FullPathNames) * NumOfFiles;
Memset(FullPathNames,0,Size);

但是,我希望能够将 FullPathNames 传递给方法,它是指向可变数量字符数组的指针数组。我希望此方法能够删除给定索引处的单个字符数组。

我使用以下代码调用该方法。

Remove_Element(FullPathNames,1, NumOfFiles);

Remove_Element 的代码:

void Remove_Element( char (*Array)[MAX_FILENAME_AND_PATHNAME_LEN], int Index, int Array_Length )    
{
int i;
char String[MAX_FILENAME_AND_PATHNAME_LEN];
char (*NewArray)[MAX_FILENAME_AND_PATHNAME_LEN];
int NewLength = Array_Length - 1;
size_t Size;

NewArray = malloc( sizeof( *NewArray) * NewLength * ( MAX_FILENAME_AND_PATHNAME_LEN ) );

Size = sizeof( *NewArray ) * NewLength;

memset(NewArray, 0, Size);
for ( i = Index; i < Array_Length - 1; i++ )
{

memcpy(String,Array[i+1],MAX_FILENAME_AND_PATHNAME_LEN); // Remove last index to avoid duplication

strcpy( Array[Index], String );
}
Array = NewArray;
}

我对当前所拥有的期望是,除了我通过从 index + 1 复制数据而删除的索引之外,FullPathNames 的原始数据仍然保留,并且 FullPathNames 中包含的原始指针为类(class)已更新。由于我也想缩小数组,因此我尝试将数组设置为等于新数组。以下信息解释了我调试此行为的尝试。

当我进入方法时,监视变量显示以下信息。

FullPathNames = XXXXXX
NewArray = Unallocated
Array = XXXXXX

填充新的临时数组后,会发生以下情况:

FullPathNames = XXXXXX
NewArray = YYYYY
Array = XXXXXX

当我退出该方法时,会发生以下情况:

FullPathNames = XXXXXX
NewArray = YYYYY
Array = YYYYY

我试图通过将其作为指针传递来修改FullPathNames。我最初尝试使用 realloc 执行此任务,但这只是导致了自由指针异常。

注意事项:MAX_FILENAME_AND_PATHNAME_LENGTH = 516;

最佳答案

如果我理解正确,您要做的就是修改初始化原始数组的代码部分中的 FullPathNames 指针。

随着您的 FullPatchNames 声明

char (*FullPathNames)[MAX_FILENAME_AND_PATHNAME_LENGTH]

您基本上声明了一个指向 MAX_FILENAME_AND_PATHNAME_LENGTH char 元素数组的指针。通过调用 void Remove_Element(...),您只需将此指针的副本提供给函数内有效的局部变量 Array。由于此 Array = NewArray;,仅更改函数内指针的本地副本,而不是 FullPathNames

如果您想更改 FullPathNames 的值,您必须向您的函数提供一个指向此指针的指针。 Remove_Element 的原型(prototype)必须如下所示:

 void Remove_Element( char (**Array)[MAX_FILENAME_AND_PATHNAME_LEN],
int Index, int Array_Length )

现在数组是一个指向(一维)字符数组的指针的指针。通过取消引用此指针,您可以更改原始指针 FullPathNames 以指向您在函数内创建的新对象。您必须将此函数的调用修改为 Remove_Element(&FullPathNames,1, NumOfFiles);。要读取数组,您必须使用 * 运算符取消引用它:

memcpy(String,*Array[i+1],MAX_FILENAME_AND_PATHNAME_LEN);
...
Array = NewArray;

警告:此代码现在将产生内存泄漏,因为您将丢失对原始对象的引用。您应该在代码中的某个位置使用 free() 函数删除它!

关于c - 动态字符数组 - 堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30608062/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com