2016-09-10 37 views
2
#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; 
} 

输出:如何将字符串分配到char *指针?

(空)

我想使用的char *作为指针去通过存储器地址获取一些数据并将值存储到m中埃默里。

对于int和int数组,它工作正常,但不适用于字符串。

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

+1

你为什么不使用。运算符将值存储到成员中?你是否知道你在做什么的问题? – 2501

+2

你没有考虑结构内的填充。 – Dmitri

+0

第1步:打开编译器警告以快速捕获像'printf(“\ n%s \ n”,* ptr)等问题。 – chux

回答

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); 
1

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

后您增加指针PTR这里:

ptr = ptr + 2*sizeof(int); 

指针ptr指向的结构分析的成员名称。如果取消引用指针ptr,则会得到char类型,因此只有一个字节。该字节不表示指向字符串的指针。

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

结果值是一个指向字符串"Peter"的指针。

+0

'ptr'可能不一定指向'struct'的'name'的地址。这取决于成员之间是否有填充。 –

+0

@RSahu显然。 – 2501

+0

ANSI C的stddef.h中的offsetof()宏可以帮助避免任何有关填充的猜测工作。 –

1

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

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

这将取消任何有关填充的猜测工作。

这个指针则必须适当地转换为打印的名字的内容:

printf("%s\n", *(char**) ptr);