如何将字符串分配到char*指针? #包括 结构分析{ 内特林; int-arr[2]; 字符*名称; }; int main() { 结构分析ana_空间[2]; char*ptr=(void*)和anau空间; ana_空间[0].lnlen=0; anau空间[0].arr[0]=1; ana_空间[0]。arr[1]=2; anau空间[0]。name=“Peter”; printf(“\n%d\n”,*ptr);//打印0; *ptr=10;//这里如何使用memcpy; printf(“\n%d\n”,*ptr);//print 10; ptr=ptr+sizeof(int);//按int前进指针; printf(“\n%d\n”,*ptr);//打印1; ptr=ptr+2*sizeof(int);//指针前进2 int; printf(“\n%s\n”,*ptr);//打印“Peter”————不工作 //*ptr=“Jim”;//如何将新名称“Jim”分配到该内存中; 返回0; }

如何将字符串分配到char*指针? #包括 结构分析{ 内特林; int-arr[2]; 字符*名称; }; int main() { 结构分析ana_空间[2]; char*ptr=(void*)和anau空间; ana_空间[0].lnlen=0; anau空间[0].arr[0]=1; ana_空间[0]。arr[1]=2; anau空间[0]。name=“Peter”; printf(“\n%d\n”,*ptr);//打印0; *ptr=10;//这里如何使用memcpy; printf(“\n%d\n”,*ptr);//print 10; ptr=ptr+sizeof(int);//按int前进指针; printf(“\n%d\n”,*ptr);//打印1; ptr=ptr+2*sizeof(int);//指针前进2 int; printf(“\n%s\n”,*ptr);//打印“Peter”————不工作 //*ptr=“Jim”;//如何将新名称“Jim”分配到该内存中; 返回0; },c,pointers,C,Pointers,输出: 0 十, 一, (空) 我想使用char*作为指针,通过内存地址获取一些数据,并将值存储到内存中 对于int和int数组,它可以正常工作,但对于字符串则不行 如何打印字符串并将新字符串值存储到内存中?由于填充和类型表示(由实现定义),您提供的代码可能会导致未定义的行为 在此处增加指针ptr后: #include <stdio.h> struct Analysis { int lnlen; int arr[2]; char* name; };

输出:

0

十,

一,

(空)

我想使用char*作为指针,通过内存地址获取一些数据,并将值存储到内存中

对于int和int数组,它可以正常工作,但对于字符串则不行


如何打印字符串并将新字符串值存储到内存中?

由于填充和类型表示(由实现定义),您提供的代码可能会导致未定义的行为

在此处增加指针ptr后:

#include <stdio.h>

struct Analysis {
    int lnlen;   
    int arr[2]; 
    char* name;
};

int main()
{
    struct Analysis ana_space[2];
    char *ptr = (void*) &ana_space;

    ana_space[0].lnlen = 0;
    ana_space[0].arr[0] = 1;
    ana_space[0].arr[1] = 2;
    ana_space[0].name = "Peter";

    printf("\n%d\n", *ptr);     // print 0;

    *ptr = 10;                  // how to use memcpy here;

    printf("\n%d\n", *ptr);     // print 10;

    ptr = ptr + sizeof(int);    // advance pointer by int;

    printf("\n%d\n", *ptr);     // print 1;  

    ptr = ptr + 2*sizeof(int);  // advance pointer by 2 ints;

    printf("\n%s\n", *ptr);     // print "Peter"; --------------not work

    //*ptr = "Jim";             // how to assign new name "Jim" into that memory;
    return 0;
}
指针ptr指向结构分析的成员名称。如果取消对指针ptr的引用,则会得到类型char,从而得到一个字节。此字节不表示指向字符串的指针

指针ptr必须转换为指向char指针的类型指针,然后取消引用,以便获得成员名称的正确完整值


该结果值是一个指向字符串“Peter”

的指针。ANSI C在stddef.h中有一个名为offsetof()的宏,它提供了一种更可靠的方法来计算结构中成员的指针偏移量。在这里,我们可以直接在ana_空间[0]中获取名称成员的地址

ptr = ptr + 2*sizeof(int);
这就排除了任何关于填充的猜测工作

然后必须正确转换此指针以打印名称的内容:

ptr = (char*) &ana_space + offsetof(struct Analysis, name);

你的方法是不可移植的。最好使用,以确保您能够可靠地指向
结构的成员的地址

printf("%s\n", *(char**) ptr);
您使用:

int main()
{
    struct Analysis ana_space[2];
    char *ptr = (void*) &ana_space;

    size_t offset1 = offsetof(struct Analysis, arr);
    size_t offset2 = offsetof(struct Analysis, name);

    ana_space[0].lnlen = 0;
    ana_space[0].arr[0] = 1;
    ana_space[0].arr[1] = 2;
    ana_space[0].name = "Peter";

    // advance pointer to point to arr.
    ptr = ptr + offset1;

    // advance pointer to point to name
    ptr = ptr + (offset2-offset1);

    // Cast the pointer appropriately before dereferencing.
    printf("\n%s\n", *(char**)ptr); 

    // how to assign new name "Jim" into that memory;
    *(char**)ptr = "Jim";
    printf("\n%s\n", *(char**)ptr);

    return 0;
}
而预期的产出是有缺陷的。它只适用于小端系统。我建议使用:

printf("\n%d\n", *ptr);     // print 0;

*ptr = 10;                  // how to use memcpy here;

printf("\n%d\n", *ptr);     // print 10;

你为什么不使用。运算符将值存储到成员中?您是否意识到与您正在执行的操作相关的问题?您没有考虑结构中的填充。步骤1:打开编译器警告以捕获问题,如
printf(“\n%s\n”,*ptr)快速。
ptr
不一定指向
struct
name
地址。这取决于成员之间是否有填充。@RSahu显然。stddef.h中ANSI C的offsetof()宏可以帮助避免对填充进行任何猜测。@RobertPrévost我建议您添加一个答案来解释这一点。帕特里克可能会从这些信息中受益。
printf("\n%d\n", *(int*)ptr);

*(int*)ptr = 10;

printf("\n%d\n", *(int*)ptr);