提问人:SRIKANTH 提问时间:11/5/2023 最后编辑:Ted LyngmoSRIKANTH 更新时间:11/6/2023 访问量:56
更改引用指针就是更改原始指针地址
Changing the reference pointer is changing the original pointer address
问:
已为 S 分配了动态内存。S->name 已被分配到动态内存中。虽然我没有对 s->name 执行任何操作,但 s->name 在 BEFORE 和 AFTER 打印中正在更改
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct meta_data
{
int roll_no;
int section;
int age;
}meta_data;
typedef struct student
{
meta_data mt_data;
char* name;
}student;
int main(void)
{
student *s = malloc(sizeof(meta_data) + 10);
s->name = (char *)s + sizeof(meta_data);
printf("sizeof(meta_data) = %d \n", sizeof(meta_data));
printf("-----BEFORE-----\n");
printf("s = %d \n", s);
printf("&(s->meta_data) = %d \n", &(s->mt_data));
printf("s->name = %d \n", s->name);
char* ptr = s->name;
printf("ptr = %d \n", ptr);
ptr += 3;
printf("ptr+3 = %d \n", ptr);
memcpy(ptr, "sri", 3);
printf("-----AFTER-----\n");
printf("s = %d \n", s);
printf("&(s->meta_data) = %d \n", &(s->mt_data));
printf("s->name = %d \n", s->name);
return (0);
}
Output :
sizeof(meta_data) = 12
-----BEFORE-----
s = 22638608
&(s->meta_data) = 22638608
s->name = 22638620
ptr = 22638620
ptr+3 = 22638623
-----AFTER-----
s = 22638608
&(s->meta_data) = 22638608
s->name = 22636914
答:
0赞
kote
11/6/2023
#1
问题不在于.问题在于你对 的调用,除非你在 C 编程方面经验丰富,否则我现在会避免。 采用两个地址,即 destination 和 source,并将在 source 中找到的字节复制到 destination 中。您的电话提供了地址等信息。源地址是编译器自动生成的静态分配的“sri”char 指针。printf
memcpy
memcpy
因此,删除对的调用将使程序按预期运行。memcpy
评论
%d
sizeof(...)
%zu
%d
%p
(void*)
student *s = malloc(sizeof(meta_data) + 10);
student
sizeof(meta_data) + 10
malloc(sizeof *s)
name
是一个 - 它通常是 4 或 8 个字节。永远不要 10 - 但也可能有填充,所以你不能按照你的方式计算大小。儗char*
struct
sizeof(student)
sizeof(meta_data) + 10
name
char name[];
s->name = (char *)s + sizeof(meta_data);