2013-08-08 4 views
-4

Мне нужно присвоить значение int указателю, как бы я это сделал?Назначить значение int указателю

Ниже приведен небольшой пример того, что я хочу.

struct { 
    int a; 
} name; 
int temp = 3; 
struct name *obj = NULL; 

Теперь мне нужно присвоить это значение '3' структуре 'a'.

+0

struct a a не является указателем. –

+6

'name.a = temp;' или 'name.a = 3;' done :) – billz

+0

как насчет нет? name - это имя структуры. – billz

ответ

0

EDIT (спасибо Andreas):

Правильно, ваша структура должна быть объявлена ​​следующим образом:

struct name { 
    int a; 
}; 

void foo() { 
    struct name n;  // allocate space for 'struct name' and call it n 
    struct name *obj;  // a pointer to a 'struct name' 
    int temp = 3;  

    obj = &n;    // make obj point to n 

    n.a = temp;   // direct assignment to a 
    obj->a = temp;  // assignment to a via pointer dereference 
          // a is now 3 in any case 
} 
2

Объявив указатель на структуру не резервирует память для него, так что сначала вы должны сделай это. Например:

obj = malloc(sizeof(*obj)); 

Теперь вы можете присвоить значение:

obj->a = temp; 

Обратите внимание, что программа, как она в настоящее время составляет не определяет «имя структуры», он определяет переменную под названием «имя», что имеет место структура. Вероятно, это не то, что вы намеревались.

+1

Вы должны каким-то образом выделить пространство для 'struct name'. 'malloc' помещает его в кучу и говорит выделить« sizeof * obj' (или, иначе говоря, размер 'struct name'). В качестве альтернативы вы можете выделить структуру в стеке без 'malloc', как показано в моем ответе. – par

+1

@joni Я думаю, что billz означает, что 'struct {...} name;' уже выделяет память - обратите внимание, что это отличается от 'struct name {...};', который только объявляет тип структуры –

+1

Очень хороший момент Andreas. Он должен быть объявлен 'struct name {...};' – par

4

С

struct { 
    int a; 
}name; 

вы уже определить переменную структуры, которая выделяет память для структуры (например, в стеке, когда это локальная переменная внутри функции). Затем, с int temp = 3;, достаточно присвоить элементу структуры, как

name.a = temp; 

Если вы хотите объявить STRUCT типа только, а затем использовать

struct name { 
    int a; 
}; 

Затем вы можете определить любое количество Struct переменные на основе этого типа, как

struct name theName; 

и сделать то же самое задание theName членов в качестве Бове:

theName.a = temp; 

Или, вы можете определить указатель на структуру, а затем должны выделить память себя:

struct name *namePtr; 
namePtr = malloc(sizeof(struct name)); 
namePtr->a = temp; 

Заметим также, что вы отметили свой вопрос как с C и C++ - особенно с структурами, вы должны решить, какой язык взять - см. Differences between struct in C and C++.

1

Основная проблема с кодом name - это не название структуры, а объект или переменная структуры, имя которой вы уже определили.

Если вы не хотите называть структуру, даже тогда ей нужна память.

struct 
{ 
     int a; 
}name, *obj; 
int temp = 3; 

int main() 
{ 
     obj=&name; // 'obj' is pointing to memory area of 'name' : Keep this in mind throughout the code 
     obj->a=temp; 
     printf("%d %u %d",temp,&temp,obj->a); 
     return 0; 
} 

Лучший вариант поставить имя в структуре затем использовать его указатель после выделения памяти

typedef struct 
{ 
     int a; 
}name; 
int temp = 3; 
name *obj = NULL; 

int main() 
{ 
     obj = (name *)malloc(sizeof(name)); 
     obj->a=temp; 
     printf("%d %u %d",temp,&temp,obj->a); 
     return 0; 
} 
0

Вот другой, аннотированный, версия вашего кода. Ran это на компиляторе Eclipse/Microsoft C, это НЕ код на C++.

#include <stdio.h> 
main() 
{ 
    // define a structure as a data type 
    typedef struct 
    { 
    int *a; 
    } name; 

    // allocate storage for an integer and set it to 3 
    int temp = 3; 

    // allocate storage for the name structure 
    name obj; 

    // set the value of a in name to point to an integer 
    obj.a = &temp; 

    // dereference the integer pointer in the name structure 
    printf("%d\n", *obj.a); 

} 
-1
obj->a = temp; 

просто попробовать!

+0

'Дефект сегментации ' –

+0

Поздравляем, вы разыменовали указатель NULL. –