我想遍历argv并将相关信息(从索引2开始)复制到一个2D char数组中,其代码段如下所示。
typedef struct
{
char *source;
char **dict;
unsigned int size_of_dict;
} t_char_cluster;..。
int main(int argc, char** argv)){
t_char_cluster data;
data.dict = malloc(argc - 2);
data.source = argv[1];
data.size_of_dict = 0;
for (unsigned i = 2; i < argc; i++) {
data.dict[i - 2] = malloc(strlen(argv[i]));
strcpy(data.dict[i - 2], argv[i]);
data.size_of_dict++;
printf(" dict[0] at i = %d : %s \n", i, data.dict[0]);
}
}直到第四次迭代(我从2开始),它才能完美地工作。在此之后,char数组中的第一个字符串(索引0)被损坏。因此,printf语句的输出如下所示:
dict[0] at i = 2 : foo
dict[0] at i = 3 : foo
dict[0] at i = 4 : foo
dict[0] at i = 5 : foo
dict[0] at i = 6 : P�Te�U
...
dict[1] at i = 15 : P�Te�U正如我通过调试发现的那样,在第4次迭代中调用malloc()之后,dict[0]被破坏了。
发布于 2019-11-28 20:47:41
您的分配data.dict = malloc(argc - 2)不正确。由于您希望创建一个(argc-2) char*数组,因此应该使用malloc((argc-2)*sizeof(char*));对其进行初始化。
此外,您的内部分配也是错误的,您应该使用data.dict[i - 2] = malloc(strlen(argv[i])+1);来提供一个额外的元素来存储最终的\0。
下一次,您可以使用诸如valgrind之类的工具轻松地检测这些不良访问。
编辑:正如Jabberwocky所指出的,你的主原型也是不正确的,你应该使用int main(int argc, char** argv)。
https://stackoverflow.com/questions/59088735
复制相似问题