如何将字符串分配到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; }
输出: 0 十, 一, (空) 我想使用char*作为指针,通过内存地址获取一些数据,并将值存储到内存中 对于int和int数组,它可以正常工作,但对于字符串则不行如何将字符串分配到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; };
如何打印字符串并将新字符串值存储到内存中?由于填充和类型表示(由实现定义),您提供的代码可能会导致未定义的行为 在此处增加指针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);