gpt4 book ai didi

c - memcpy 和 "alias"的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:52 24 4
gpt4 key购买 nike

我正在处理 memcpy 以将一个数组复制到另一个数组:这是代码,(我也给出了声明)

.... /* s is a struct with int *t_con_cust;  */
/* bad to use an equivalent name i guess ..*/
s.t_con_cust = malloc(nb_cust*sizeof(*s.t_con_cust));
int *t_con_cust = malloc(nb_cust*sizeof(*t_con_cust));
...
t_con_cust[0] = 1;
memcpy(s.t_con_cust, t_con_cust, nb_cust*sizeof(int));

fprintf(stdout, "s.t_con_cust[0] -> %d \n", s.t_con_cust[0]);
t_con_cust[0] = 0;
fprintf(stdout, "s.t_con_cust[0] -> %d \n", s.t_con_cust[0]);

执行给了我:

s.t_con_cust[0] -> 1

s.t_con_cust[0] -> 0

这超出了我的范围,因为当我尝试使用这样的“示例代码”时

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
int *dest;
} lambda_struct;


int main(void) {
lambda_struct s;
s.dest = malloc(10*sizeof(*s.dest));
int *src = malloc(10*sizeof(*src));
int i;

for(i = 0; i < 10; ++i)
src[i] = 1;

memcpy(s.dest, src, 10);

fprintf(stdout, "dest[0] -> %d \n", s.dest[0]);
src[0] = 0;
fprintf(stdout, "dest[0] -> %d \n", s.dest[0]);

free(src);
free(s.dest);

return 0;
}

执行给了我预期的结果,-> 1 和 1。

有什么想法吗?谢谢

最佳答案

如果这段代码

fprintf(stdout, "s.t_con_cust[0] -> %d \n", s.t_con_cust[0]);
t_con_cust[0] = 0;
fprintf(stdout, "s.t_con_cust[0] -> %d \n", s.t_con_cust[0]);

结果

s.t_con_cust[0] -> 1
s.t_con_cust[0] -> 0

那么唯一有意义的解释就是

t_con_cust == s.t_con_cust

如果该条件不成立,那么对 t_con_cust[0] 的赋值会如何影响 s.t_con_cust[0]

我预测,当你测试这两个指针是否相等时,你会发现它们确实相等。然后您只需要找到将两个指针分配给相同值的代码部分。

关于c - memcpy 和 "alias"的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8964219/

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