- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 malloc() 创建动态内存,它在创建它的函数中工作,但在该函数结束后它不再工作。我试图做到这一点,即使在函数内创建的动态内存结束后,也可以访问在函数内创建的动态内存。
typedef struct ListObj
{
int data;
struct ListObj* next;
struct ListObj* prev;
} ListObj;
typedef struct List
{
struct ListObj* front;
struct ListObj* back;
struct ListObj* cursor;
} List;
List newList(void)
{
List* pL = malloc(sizeof(List));
if (pL == NULL)
{
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}
pL->front = pL->back = pL->cursor = NULL;
return *pL;
}
ListObj newListObj(void)
{
ListObj* pLO = malloc(sizeof(ListObj));
if (pLO == NULL)
{
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}
pLO->next = pLO->prev = NULL;
return *pLO;
}
int length(List L)
{
L.cursor = L.front;
int n = 0;
while (L.cursor != NULL)
{
n++;
L.cursor = L.cursor->next;
}
return n;
}
void append(List L, int data)
{
ListObj LO = newListObj();
LO.data = data;
if (L.back != NULL)
{
LO.prev = L.back;
L.back->next = &LO;
}
L.back = &LO;
if (L.front == NULL)
{
L.front = &LO;
}
if (L.front == NULL)
{
printf("append null\n");
}
}
List L = newList();
for (i = 0; i < 5; i++)
{
if (length(L) == 0)
{
append(L, i);
}
}
length(L) 一直返回 0,每次调用 append() 时它应该增加 1。
最佳答案
考虑使用这些小改进:
原型(prototype):
List newList(void);
应该改为:
List *newList(void);
那么该函数调用中的返回语句应该是:
return pL; //(remove *)
这个建议对于其他尝试类似用法的函数也是一样的,例如:ListObj newListObj(void)
等
在调用函数中使用完后不要忘记释放这 block 内存。
以下基本上是您的代码没有其他改进除了添加main()
函数通过一个示例调用,关于使用指针的建议,以及使用指针的后续副作用。例如,结构指针符号、释放等:(它构建并运行,但我不确定这些改进是否会解决代码可能存在的其他问题。)
List * newList(void)
{
List* pL = malloc(sizeof(List));
if (pL == NULL)
{
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}
pL->front = pL->back = pL->cursor = NULL;
return pL;
}
ListObj * newListObj(void)
{
ListObj* pLO = malloc(sizeof(ListObj));
if (pLO == NULL)
{
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}
pLO->next = pLO->prev = NULL;
return pLO;
}
int length(List *L)
{
L->cursor = L->front;
int n = 0;
while (L->cursor != NULL)
{
n++;
L->cursor = L->cursor->next;
}
return n;
}
void append(List *L, int data)
{
ListObj *LO = newListObj();
LO->data = data;
if (L->back != NULL)
{
LO->prev = L->back;
L->back->next = LO;
}
L->back = LO;
if (L->front == NULL)
{
L->front = LO;
}
if (L->front == NULL)
{
printf("append null\n");
}
}
int main(void)
{
List *L = newList();
for (int i = 0; i < 5; i++)
{
if (length(L) == 0)
{
append(L, i);
}
}
free(L);
return 0;
}
关于c - 动态内存只能在函数调用内部访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58205742/
有一条(相对)众所周知的 Perl 公理:“只有 Perl 可以解析 Perl”。我想知道 Perl 6 是否仍然如此? 扩大讨论...考虑到 PyPy 最近的更新,我想到了这个问题。 Perl 独特
这是设置。在上一个问题中,我发现我可以通过子组件中的状态传递对象属性,然后使用 componentDidUpdate 获取该对象属性。在这种情况下,状态和属性都称为到达。 这是基本代码... expo
我运行的是 10.5.2 社区版。我已经标记了 源/主要/资源 作为源目录。我可以右键单击并“编译”某些文件,据我所知,这意味着 IDE 将文件复制到与发送类文件的“com.mydomain.pack
我是一名优秀的程序员,十分优秀!