我正在这里进行Uni任务,我遇到了一个问题。我试图使用for循环在字符串内的点处存储字符串输入。稍后我打算使用指向存储数据的地方的指针来获取字符串。现在问题是,当我在for-loop中移动时,点的地址也会改变。这段代码:
printf("B: %p\n", txt->point);
for(i = 0; i < input_sz; i++)
{
txt->point[i] = input[i];
}
printf("A: %p\n", txt->point);
给出输出:
B: 0x7fc111803200
A: 0x7fc111803265
其中B是前值,A是后复制值。
任何帮助调试此功能都将非常感谢!
编辑:这里有更多代码:
结构:
struct text_storage {
char* start;
char* point;
char* end;
} typedef text_t;
初始化功能:
text_t* text_init(void *memory, size_t size)
{
text_t* to_return;
if(size < sizeof(text_t))
{
return NULL;
}
to_return = (text_t*) memory;
to_return->start = to_return;
to_return->end = to_return->start + size;
to_return->point = to_return->start;
printf("Start: %p, point: %p, end: %p, end-start: %d\n", to_return->start, to_return->point, to_return->end, (to_return->end - to_return->start));
return to_return;
}
发生错误的文本存储方法:
int text_store_entry(text_t *txt, const char *input, size_t input_sz)
{
int to_return;
char* begin = txt->point;
int i;
if(input_sz > (txt->end - txt->point))
{
return -1;
}
printf("Start: %p, point: %p, end: %p, end-start: %d\n", txt->start, txt->point, txt->end, (txt->end - txt->start));
printf("B: %p\n", txt->point);
for(i = 0; i < input_sz; i++)
{
txt->point[i] = input[i];
}
printf("A: %p\n", txt->point);
}
主要功能(仅用于测试目的):
int main(int argc, char* argv[])
{
void* memory = malloc(10000);
char* a = "hei pa deg din trekkbasun";
text_t* txt;
int memoverwritten;
txt = text_init(memory, 10000);
memoverwritten = text_store_entry(txt, a, (size_t)26);
printf("got through\n");
return 0;
}
答案 0 :(得分:3)
问题很可能是由于struct text_storage
类型结构的初始化。这种结构包含三个指向文本的指针。应该初始化每个指针,可能使用malloc
。您的text_init
功能无法正常执行此操作。
实际上,存储start
指针的位置与您要使用的内存的第一个字节重叠。
我猜你需要这样的结构:
typedef struct text_storage {
char* start;
char* point;
char* end;
char* data;
} text_t;
使用如下函数初始化:
text_t text_init(void *memory, size_t size)
{
text_t to_return;
to_return.data = (char *) memory;
to_return.start = to_return.data;
to_return.end = to_return.start + size;
to_return.point = to_return.start;
return to_return;
}
答案 1 :(得分:0)
打印txt-&gt;指向循环中的点并查看其更改的点。我猜它在分配给txt-&gt; point [0]时会发生变化。我对printf并不完全熟悉,所以我不确定它是什么打印出来的,但是数组的名称引用了第一个位置。如果printf打印出一个指针,txt-> point [i]总是一个char指针,而printf可能会取消引用txt-&gt; point,这将得到它的第一个条目,然后显示那里的地址,你将点更改为输入[i]时进行分配。