改变引用指针就是改变原指针地址

问题描述 投票:0回答:1

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
c memory memory-management dynamic-memory-allocation
1个回答
0
投票

问题不是

printf
。问题是你对
memcpy
的调用,除非你在 C 编程方面经验丰富,否则我现在会避免这样做。
memcpy
采用两个地址:目标和源,并将源中找到的字节复制到目标中。您的电话会提供地址等信息。源地址是编译器自动生成的静态分配的“sri”字符串。

因此,删除对

memcpy
的调用将使程序按照您的预期运行。

© www.soinside.com 2019 - 2024. All rights reserved.