c内存分配

c内存分配,c,pointers,memory-management,C,Pointers,Memory Management,我有以下问题。代码是这样的 num_tokens++; words = (char**) realloc(words, sizeof(char**) * (num_tokens + 1) ); words[num_tokens] = (char *) malloc(sizeof(char) * strlen(tmp)+1 ); strcpy(words[num_tokens], tmp); 其中num_标记最初设置为0,单词最初包含一个指向字符串的指针。我发现当num_标记变为1时,tmp被复

我有以下问题。代码是这样的

num_tokens++;
words = (char**) realloc(words, sizeof(char**) * (num_tokens + 1) );
words[num_tokens] = (char *) malloc(sizeof(char) * strlen(tmp)+1 );
strcpy(words[num_tokens], tmp);
其中num_标记最初设置为0,单词最初包含一个指向字符串的指针。我发现当num_标记变为1时,tmp被复制到单词[1]中,单词[0]也会发生变化。有什么问题吗


谢谢

您的计数器和您赋予它的含义似乎不一致。num_标记反映了单词数组中的标记数。这意味着您应该在分配中分配“num_令牌”,而不是“num_令牌+1”

然后,您应该在num_标记上赋值-1

如果您不这样做,就我所知,您将永远不会写入0位置,这可能会导致那里的数据单元化,并且您会因此感觉数据“更改”或“被覆盖”


总结:这种类型的代码永远不会写入单词[0],您会在那里找到随机数据。

Place
num_tokens++
strcpy()之后因为在strcpy行,num_标记已经是1。未定义num_标记0。谢谢。

我已经知道一个问题了:假设
单词是
字符**
,你应该用
sizeof(char*)
调用
realloc
,而不是
sizeof(char**)
。另外,这是C还是C++?你的头衔上写着一个,标签上写着另一个。(是的,它们是不同的。)@chrislutz,这会有什么区别,因为在这两种情况下,sizeof操作符都会返回指针的大小。我同意这并不清楚,但在功能上会有区别吗?@christaylor-C标准不能保证所有指针类型都是相同的大小。它应该可以在任何一个正常的系统上运行,但为什么要写错误的代码呢?我觉得代码看起来没问题。我认为问题出在别处。或者发布一个简单完整的测试用例?第二个(同样不相关的)问题:
x=realloc(x,n)
如果调整大小失败,可能会泄漏内存。使用
tmp=realloc(x,n);如果(tmp)x=tmp;else/*无法调整大小,但仍有x*/提问者说
单词最初包含一个指向字符串的指针
。因此,要么
words
是一个
char*
并且所有内容都丢失了,要么
words
是一个正确分配的
char**
,其第一个也是唯一一个条目已经包含一个指向字符串的
char*
。如果是这样,很可能是该字符串被覆盖了。毫无意义:如果单词已经包含1个字符串,从语义上讲num_标记应该是1,而不是0。(可能是因为对postfix++发生的时间的误解)
num_标记
在提问者的第一行代码中变成
1
,而他
realloc()
s
num_标记+1
指针,因此这是一个语义混乱但仍然有效的场景。当然,如果
words[0]
没有初始化,任何事情都会发生。我不确定。他说单词[0]已经初始化,但我们没有看到它。其中是将初始单词数组分配到适当大小的位置,以及对单词[0]的分配位置?
num_tokens++; // 0 => 1

strcpy(words[num_tokens], tmp); // copy tmp to words[1]