S 已分配动态内存。S->name 已分配部分动态内存。虽然我没有对 s->name 执行任何操作,但 s->name 在打印之前和之后正在更改
#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
问题不是
printf
。问题是你对 memcpy
的调用,除非你在 C 编程方面经验丰富,否则我现在会避免这样做。 memcpy
采用两个地址:目标和源,并将源中找到的字节复制到目标中。您的电话会提供地址等信息。源地址是编译器自动生成的静态分配的“sri”字符串。
因此,删除对
memcpy
的调用将使程序按照您的预期运行。