首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C字符数组中信息丢失

C字符数组中信息丢失
EN

Stack Overflow用户
提问于 2019-11-28 20:18:24
回答 1查看 61关注 0票数 0

我想遍历argv并将相关信息(从索引2开始)复制到一个2D char数组中,其代码段如下所示。

代码语言:javascript
运行
复制
typedef struct
{
    char *source;

    char **dict;
    unsigned int size_of_dict;
} t_char_cluster;

..。

代码语言:javascript
运行
复制
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语句的输出如下所示:

代码语言:javascript
运行
复制
 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]被破坏了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59088735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档