更改引用指针就是更改原始指针地址

Changing the reference pointer is changing the original pointer address

提问人:SRIKANTH 提问时间:11/5/2023 最后编辑:Ted LyngmoSRIKANTH 更新时间:11/6/2023 访问量:56

问:

已为 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
c 内存管理 动态内存分配

评论

3赞 Ted Lyngmo 11/5/2023
不要用打印的值,用.不要用于打印指针的值,请使用指针并将其转换为 。%dsizeof(...)%zu%d%p(void*)
3赞 Ted Lyngmo 11/5/2023
另外:这是不安全的。a 的大小不是 。它可以更少,但也可能更多。为什么不获得合适的尺寸?student *s = malloc(sizeof(meta_data) + 10);studentsizeof(meta_data) + 10malloc(sizeof *s)
0赞 SRIKANTH 11/5/2023
假设名称的长度始终小于 10 个字节,我想避免对名称进行单独的内存分配,并希望将其作为 student 的一部分连续存储。我在这里模拟了这个问题。
0赞 Ted Lyngmo 11/5/2023
name是一个 - 它通常是 4 或 8 个字节。永远不要 10 - 但也可能有填充,所以你不能按照你的方式计算大小。儗char*structsizeof(student)sizeof(meta_data) + 10
2赞 Ted Lyngmo 11/5/2023
你是想做一个灵活的阵列吗?如果是这样,请按如下方式定义它: 并删除 .示例(已修复上述所有问题)namechar name[];s->name = (char *)s + sizeof(meta_data);

答:

0赞 kote 11/6/2023 #1

问题不在于.问题在于你对 的调用,除非你在 C 编程方面经验丰富,否则我现在会避免。 采用两个地址,即 destination 和 source,并将在 source 中找到的字节复制到 destination 中。您的电话提供了地址等信息。源地址是编译器自动生成的静态分配的“sri”char 指针。printfmemcpymemcpy

因此,删除对的调用将使程序按预期运行。memcpy