这里是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;
}
修改
大家好我做了一些更改......但仍然遇到了访问冲突。请指教!
答案 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 *x
和char *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
之后,您还需要分配内存块以将字符串存储到函数中的y
和pt
。当你完成工作后,你需要先释放字符串(内存块),然后释放结构。
答案 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执行相同的操作,并且不要忘记单独释放为字符串分配的存储空间,然后释放为结构分配的存储空间。