C中的指针值更改和内存

时间:2014-02-20 14:57:26

标签: c

我的代码中遇到了一个问题,我在使用一个指向内存的指针,我希望将其存储在一个我称之为Holder的数组中。该程序正在从标记为行的txt文件中读取数据。

Holder h; 
Holder anArray[numberOfValues];
char* entry = malloc(160*sizeof(char));
int i = 0;

While(Something) {
   If(x happens) {
     char* p = strtok(entry,".")   //Taking off part of a string based on a "."
     h.firstpart = p;
     p = strtok(NULL, " ");       //Grab second part of string.
     h.secondpart = p;
   }
   else {
     anArray[i] = h;
     i++;
   }

我遇到的问题是h.firstpart和h.secondpart都将具有相同的值,因为它们只是指向某个东西而不是实际值本身。当它到达最后一个循环时,我在数组中的所有值都设置为最后一行的东西。

很抱歉,如果这张贴在其他地方,请链接我,如果是的话。我是C新秀,现在已经找了几个小时的工作。我假设我需要malloc更多的内存,并以某种方式将p指向的值放入该内存?我对如何为这个循环做这件事感到困惑。

这也是家庭作业,但他们希望我已经知道C,所以这个问题的背景并没有解决我的问题。

2 个答案:

答案 0 :(得分:1)

由于entry的内容被每一行覆盖,您需要将值复制到另一个位置。

最简单的方法是使用strdup,它为以空字符结尾的字符串分配内存并复制它:

While(Something) {
   If(x happens) {
     char* p = strtok(entry,".")   //Taking off part of a string based on a "."
     h.firstpart = strdup(p);
     p = strtok(NULL, " ");       //Grab second part of string.
     h.secondpart = strdup(p);
   }
   else {
     anArray[i] = h;
     i++;
   }

strdup<string.h>

中声明

答案 1 :(得分:0)

警惕strtok。它修改了它正在检查的字符串。

假设您的entry是从地址1000开始的一块内存,并且包含字符串“abcdef”

1000 1001 1002 1003 1004 1005 1006
a    b    c    d    e    f    g

entry == 1000

如果你这样做:

h.firstpart = strok(entry, "c");

然后strtok()将使用'c'作为分隔符返回它找到的第一个标记。但它通过将'c'替换为NULL来实现这一点!!

1000 1001 1002 1003 1004 1005 1006
a    b    NULL d    e    f    g

entry == 1000
h.firstpart == 1000 // "ab"

当你再次调用strtok时,以NULL作为第一个参数,它返回下一个标记,再次用NULL替换分隔符。

h.secondpart = strtok(null, "f");

1000 1001 1002 1003 1004 1005 1006
a    b    NULL d    e    NULL g

entry == 1000
h.firstpart == 1000 // "ab"
h.secondpart == 1003 // "de"

因此,h.firstpart和h.secondpart是指向原始内存块的指针。它们并不相同。但strtok()已将NULLS写入您的记忆中,这可能不是您想要的。

要解决这个问题,要么在让strtok之前复制内存,要么使用与strtok不同的内容。