gpt4 book ai didi

c - C 中的 char* 数组

转载 作者:行者123 更新时间:2023-12-04 06:00:29 25 4
gpt4 key购买 nike

我希望我的程序做的是从用户那里读取输入文本,用空格作为分隔符对该字符串进行标记,并将每个标记存储在一个 char* 数组中,然后将其返回。

这是我试图使其正常工作的一段代码:

typedef char* String;
String* split(char* cmd)
{
char* param;
char tmp[128];
String* result = (String*) malloc(10*sizeof(String));
memset(result,NULL,10);

strcpy(tmp,cmd);

param = strtok(tmp," ");

int index = 0;
while(param && index < sizeof(result) / sizeof(*result))
{

result[index] = (char*) malloc(strlen(param));
strcpy(result[index],param);

param = strtok(NULL," ");
index++;
}

}

其中 cmd 是我要标记的字符串,result 是包含每个标记的数组。

尝试使用简单的 for 循环遍历返回的结果时,此代码段会导致错误(出现段错误)
String* splittedCmd = split(command);

int i;
for(i=0;i<10;i++)
{
if(splittedCmd[i] != NULL)
printf("%s\n",splittedCmd[i]);
}

最佳答案

这里有几件事是错误的。

首先也是最明显的,你正在返回 result这是一个数组(但衰减为指向数组的指针),它在函数的堆栈上分配,以便在函数返回时回收。您需要动态分配数组(并依赖调用者到 free 它):

String *result = malloc(10 * sizeof(String));

另外,你的条件是停止 while环形:
if(index == sizeof(result))

将让循环运行直到 index40 (如果 char* 在您的平台上是 4 个字节)因为 sizeof以字节为单位返回操作数的大小,而不是数组元素,所以 sizeof(result)是(同样,取决于平台)40。这显然超出了数组的范围。

如果您仍然使用本地数组而不是 malloc ,你可以把它改成
if (index == sizeof(result) / sizeof(*result))

但是,您现在不能这样做,因为 result只是一个指针而不是数组和 sizeof(result)将始终是您平台上指针的大小。

您可以删除该 if彻底改变 while条件
while (param && index < 10)

这确保 param不是 NULL还有那个 index小于 10。您应该考虑制作 #defineconst int或数组大小的东西,并使用它而不是使用魔数(Magic Number)。

你也需要改变
memset(result,NULL,10);


memset(result,NULL, sizeof(String) * 10);

因为如果你不这样做, memset仅将指向的内存的前 10 个字节设置为 result到 0,而不是整个事情,因为它需要以字节为单位的数字,而不是数组元素。

关于c - C 中的 char* 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8966598/

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