#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;
}
输出:
0
10
1
(空)
我想使用char *作为指针来遍历内存地址以获取一些数据并将值存储到内存中。
对于int和int数组,它工作正常,但不适用于字符串。
如何打印字符串并将新字符串值存储到内存中?
答案 0 :(得分:1)
您提供的代码可能会因填充和类型表示而导致未定义的行为,这些类型是实现定义的。
在这里增加指针ptr之后:
ptr = ptr + 2*sizeof(int);
指针ptr指向struct Analysis的成员名称。如果取消引用指针ptr,则得到char类型,因此得到一个字节。此字节不表示指向字符串的指针。
指针ptr必须强制转换为指向char的指针的类型指针,然后取消引用,以便获得成员名称的正确值和完整值。
结果值是指向字符串"Peter"
的指针。
答案 1 :(得分:1)
ANSI C在stddef.h中有一个名为offsetof()的宏,它提供了一种更可靠的方法来计算结构中成员的指针偏移量。在这里,我们可以直接在ana_space [0]中获取名称成员的地址。
ptr = (char*) &ana_space + offsetof(struct Analysis, name);
这会对填充进行任何猜测。
然后必须正确转换此指针以打印名称的内容:
printf("%s\n", *(char**) ptr);
答案 2 :(得分:1)
您的方法无法移植。最好使用offsetof
确保您可以可靠地指向struct
成员的地址。
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;
并且预期的产出存在缺陷。它仅适用于小端系统。我建议使用:
printf("\n%d\n", *(int*)ptr);
*(int*)ptr = 10;
printf("\n%d\n", *(int*)ptr);