2015-03-02 32 views
0

我一直在努力试图为什么我收到以下警告要弄清楚的一个元素的指针:
初始化使指针从整数没有投使得存储字符数组

高亮警告我在下面提到。我目前使用的代码只是以链表形式创建元素树的开始。此代码似乎工作正常,但我得到停靠点警告。

typedef struct Node { 
     struct Node *leftChild; 
     struct Node *rightChild; 
     char data; 
} Node; 

Node *TreeCreate(int level, const char *data) { 
    struct Node *ptr = (struct Node*) malloc(sizeof (Node)); 
    if (ptr == NULL) { 
     // malloc failed 
     return 0; 
    } 
    ptr->data = data; // WARNING 
    ptr->leftChild = NULL; 
    ptr->rightChild = NULL; 
    return ptr; 
} 
// TEST CODE IN MAIN 
char list[6] = {'A', 'B', 'C','\0'}; 

// Determines the element 
const char *tree = list[0]; // WARNING 
ptr = TreeCreate(1, tree); 
if (ptr != NULL) { 
    sprintf(string, "TreeData: %c\n", ptr->data); 
    OledDrawString(string); 
    OledUpdate(); 
} 
+0

首先[不投的malloc'的结果()'](http://stackoverflow.com/a/605858/1983495)。然后,请发布'string'声明。 – 2015-03-02 23:51:10

+0

typedef'ing结构总是一个坏主意,应该避免 – user3629249 2015-03-03 01:35:51

+0

在C中,malloc(和家族)返回的值不应该被转换 – user3629249 2015-03-03 01:37:04

回答

1

你根本错误是你的char这是错误的

const char *tree = list[0]; // WARNING 

这不会产生你所期望的结果分配poitner。

在这种情况下,*不提领的足尖,你声明poitner和pointeing与它char,那么当您试图访问指针,你的程序会在无效的内存地址读取导致未定义行为。

然后你做相反的事情

ptr->data = data; 

你应该让编译器警告,以避免这种错误。

要处理,你显然要处理的数据,首先你需要重新定义这样

typedef struct Node { 
    struct Node *leftChild; 
    struct Node *rightChild; 
    char *data; 
    /* ^this should be a char pointer */ 
} Node; 

然后在TreeCreate()功能的结构,首先使用memcpy()这样

分配空间,然后复制数据
Node *TreeCreate(int level, const char *data) { 
    size_t  length; 
    struct Node *ptr; 

    ptr = malloc(sizeof (Node)); 
    if (ptr == NULL) { 
     return NULL; 
    } 
    if (data != NULL) 
    { 
     length = strlen(data); 
     ptr->data = malloc(1 + length); 
     if (ptr->data != NULL) 
      memcpy(ptr->data, data, 1 + length); 
    } 
    else 
     ptr->data = NULL;   

    ptr->leftChild = NULL; 
    ptr->rightChild = NULL; 

    return ptr; 
} 
+0

此外,它是在代码顶部的另一种方式。他分配一个指向char的指针(在'ptr-> data = data; // WARNING'中,因为ptr-> data是一个char。 – russianfool 2015-03-02 23:53:27

+0

@russianfool是的,我认为OP将'char' poitners与'char – 2015-03-02 23:55:26

0

我想我明白了。以下修正了我的警告。感谢您的快速响应!

const char *tree = &list[0]; 
ptr->data = *data; 
+0

如果这是你想要的,你不应该使用指针 – 2015-03-02 23:59:49

+0

是的,不知道为什么我们的教授让我们使用Node * TreeCreate的指针输入,但是也许它拥有更多的相关性,我只有刚开始搞这个任务。 – Connor 2015-03-03 00:06:41

0
the following, a complete program, 
that cleanly compiles 
and has the warnings fixed 
and eliminates the clutter and unnecessary typedef statements. 

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


struct Node 
{ 
     struct Node *leftChild; 
     struct Node *rightChild; 
     char data; 
}; 

struct Node *TreeCreate(int level, const char *data) 
{ 
    struct Node *ptr = malloc(sizeof (struct Node)); 
    if (ptr == NULL) 
    { 
     // malloc failed 
     return NULL ; 
    } 

    // implied else, malloc successful 

    ptr->data = *data; // WARNING 
    ptr->leftChild = NULL; 
    ptr->rightChild = NULL; 
    return ptr; 
} 

int main() 
{ 
    struct Node *ptr = NULL; 
    char string[120] = {'\0'}; 

    // TEST CODE IN MAIN 
    char list[6] = {'A', 'B', 'C','\0'}; 

    // Determines the element 
    const char *tree = &list[0]; // WARNING 

    ptr = TreeCreate(1, tree); 

    if (ptr != NULL) 
    { 
     sprintf(string, "TreeData: %c\n", ptr->data); 
     //OledDrawString(string); 
     //OledUpdate(); 
    } 
    return 0; 
}