指针使用不正确导致输出错误?

时间:2016-02-18 17:55:27

标签: c pointers struct

我有一个完整填充的结构。名字是strdup' d。我想要做的是,创建一个指针数组,其中数组中的元素指向strdup的变量。

这就是我的尝试:

ui-effects-wrapper

这是我的输出:

struct Student{
        char *name;
        int age;
}Student;

void storeAdrress(const Student *student1,char **arrayOfPointers){
    arrayOfPointers[0] = student1->name;    

    printf("Struct variable: %p",student1->name);
    printf("Pointer variable: %p",arrayOfPointers[0]);
}

int main(void){
    Student *student1 = calloc(1,sizeof(Student));
    student1->name = strdup("Tom");

    char *arrayOfPointers[100] = {0};

    storeAdrress(student1,arrayOfPointers);

    free(student1->name);
    free(student1);

    return(0);
}

我的目标是让Struct variable: (0x5502a80) Pointer variable: (nil) 拥有该名称的地址。这显然不起作用,因为arrayOfPointers[0]没有存储指针位置。

有人可以告诉我我做错了什么。

2 个答案:

答案 0 :(得分:2)

天气风向标打败了我,但是这里是对代码的补充更正,而不使用typedef,并添加了一些错误检查:

#define _POSIX_C_SOURCE 200809L

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Student{
    char *name;
    int age;
};

void storeAddress(struct Student * stdt, char ** pArray, size_t index)
{
    pArray[index] = stdt->name;    
    printf("Struct variable: %p\n", (void *) stdt->name);
    printf("Pointer variable: %p\n", (void *) pArray[index]);
}

int main(void)
{
    struct Student *student1 = calloc(1,sizeof(*student1));
    if ( !student1 ) {
        perror("couldn't allocate memory for struct Student");
        exit(EXIT_FAILURE);
    }

    student1->name = strdup("Tom");
    if ( !student1->name ) {
        perror("couldn't allocate memory for student name");
        exit(EXIT_FAILURE);
    }

    char *arrayOfPointers[100] = {0};

    storeAddress(student1, arrayOfPointers, 0);

    free(student1->name);
    free(student1);

    return 0;
}

带输出:

Paul@Pauls-iMac:~/Documents/src/sandbox/names$ ./names
Struct variable: 0x7fd632403210
Pointer variable: 0x7fd632403210
Paul@Pauls-iMac:~/Documents/src/sandbox/names$ 

答案 1 :(得分:0)

这是对您的计划的修补。我在结构定义中添加了typedef,我更正了使用calloc来指定struct大小,而不是指针大小,我添加了几个newline s 。它为两个地址打印相同的值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Student{
    char *name;
    int age;
} Student;

void storeAdrress(const Student *student1,char **arrayOfPointers){
    arrayOfPointers[0] = student1->name;    
    printf("Struct variable: %p\n", student1->name);
    printf("Pointer variable: %p\n", arrayOfPointers[0]);
}

int main(void){
    char *arrayOfPointers[100] = {0};
    Student *student1 = calloc(1, sizeof(*student1));
    student1->name = strdup("Tom");
    storeAdrress(student1, arrayOfPointers);

    free(student1->name);
    free(student1);

    return 0;
}

节目输出:

Struct variable: 00762DE0
Pointer variable: 00762DE0