memcpy和“别名”的奇怪行为

时间:2012-01-22 20:02:12

标签: 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;
}

执行给我预期的结果, - &gt; 1和1。

有什么想法吗?谢谢

1 个答案:

答案 0 :(得分:2)

如果此代码

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] - &gt; 1
  s.t_con_cust [0] - &gt; 0

然后唯一有意义的解释是

t_con_cust == s.t_con_cust

如果该条件不正确,那么t_con_cust[0]的分配如何影响s.t_con_cust[0]

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