帮助结构和C语言循环

时间:2011-09-06 15:43:27

标签: c struct

这里是C语言的初学者。这是合法的吗?运行此代码时,我不断收到状态访问冲突:

struct point {
    char *x;
    char *y;
}

int main()
{
    ....
    struct point *pt;

    for (;;)
    {
        ....        
        pt = process_message(message);
        printf("%s",pt->x);
        ...
    }
}

struct point* process_message(char* message)
{
    struct point *pt;
    pt = malloc(1*sizeof(struct point))
    strncpy(pt->x, message, 4);
    return pt;
}

修改

大家好我做了一些更改......但仍然遇到了访问冲突。请指教!

5 个答案:

答案 0 :(得分:11)

您需要在struct point中为process_message分配内存。

这样的事情:

struct point* process_message(char* message)
{
    struct point *pt;
    pt = malloc(1*sizeof(struct point));
    // ... do some processing ...
    return pt;
}

当然,你之后应该free指针。

此外,您应该在struct point中返回process_message或检查您的类型一致性。如果仔细观察,您会看到您正在返回struct price*但是你期待(在主叫方面)struct point *

<强>更新

现在该问题已更新,您还需要为char *xchar *y 分配内存,如果您要执行此操作:

strncpy(pt->x, message, 4);

我建议您阅读一些(或很多)关于内存管理和C ++指针的内容。指针不是处理 C编程语言中数据的唯一方法。

(没有因代码简单而导致错误检查)

答案 1 :(得分:5)

您的main功能正常。您的问题出在process_message,您正在使用指向结构的指针但不为其分配任何内存,访问它,然后返回它。单独声明指针不会创建用于保存结构的内存。所以你应该为结构分配(例如使用malloc)内存,这样在函数结束后内存将“存在”。然后你可以在你做的时候将指针返回到它,然后当你完成它时,你会free它在主。

鉴于您正在进行的简单操作,可能有更好的方法来实现此目标。一种是在main函数中保留一个“scratch”结构本地,并将其地址传递给处理消息:

struct point pt;
process_message(message, &pt);
printf("%s", pt.x);

这将“重用”本地内存而不需要alloc / free。请注意,您不返回任何内容,只需在流程函数中“填写”结构。

最后,如果您使用的是现代版本的C,您实际上可以根据需要从函数返回完整结构:

struct point process_message(char* message)
{
    struct point pt;
    ... do some processing ...
    return pt;
}

并称之为:

struct point pt = process_message(message);

答案 2 :(得分:2)

请记住在函数process_message

中分配内存
pt = malloc (sizeof (struct point));
/* do processing */
return pt;

完成pt工作后,请记得将其释放free (pt)

修改

在分配x之后,您还需要分配内存块以将字符串存储到函数中的ypt。当你完成工作后,你需要先释放字符串(内存块),然后释放结构。

答案 3 :(得分:0)

每当你创建指针时,它只是一个sizeof(ptr)内存,它指向一些数据。因此,您必须拥有存储数据的内存。 因此要么在函数(process_message)中分配内存,要么在调用函数中分配内存。 它应该像

struct point *pt = (struct point*)malloc(sizeof(struct point));

答案 4 :(得分:0)

正如现在所写,您正在分配结构点,但该结构包含指针到字符串,而不包含字符串本身的存储。在复制到字符串之前,需要为字符串分配空间:

pt = malloc(1*sizeof(struct point));
pt->x = (char *)malloc( strlen(message) + 1);

在使用之前不要忘记对pt-&gt; y执行相同的操作,并且不要忘记单独释放为字符串分配的存储空间,然后释放为结构分配的存储空间。