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

标签 c arrays alias memcpy

我正在处理 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/

相关文章:

c - 从文件中读取字符矩阵

python-3.x - 如何在执行时在Singularity容器中设置Python别名?

Git 别名 : how to pass current directory to shell command?

python - 当指定绝对路径 $/usr/bin/python 与 $ python 别名为相同路径时,如何会产生不同的结果?

c - 将结构定义的地址存储到指针中时是否会创建结构实例?

c - 分配存储空间来存储一项并将其值设置为某项

PHP fetch_assoc 返回值,循环

c++ - 将文件中的多个输入分隔为偶数或奇数

python - 使用numpy数组时如何处理itertools.product?

c - 如何用链表实现O(M^2N)的两个多项式的乘法?