gpt4 book ai didi

C 指针地址变化无需赋值

转载 作者:行者123 更新时间:2023-12-04 04:40:40 25 4
gpt4 key购买 nike

我正在这里完成一项 Uni 作业,但遇到了一个问题。我正在尝试使用 for 循环在结构内的某个点存储字符串输入。稍后我打算使用指向存储数据的位置的指针来获取字符串。现在的问题是,当我在 for 循环中继续前进时,该点的地址也会发生变化。这段代码:

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;
}

最佳答案

问题很可能是由于类型 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;
}

关于C 指针地址变化无需赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18931349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com