我尝试实现自动完成功能的第一部分,该功能接受字符串,计算特定字母的索引,然后在该索引处分配另一个结构指针。它还存储字符串数组中可能的单词完成。出于某种原因,当我尝试访问字符串数组字段时程序崩溃,我无法弄清楚原因。我该如何解决这个问题?
由于
import numpy as np
import cv2
cap = cv2.VideoCapture('C:\Users\u266772\Desktop\Video\video2.mp4')
while(cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
答案 0 :(得分:2)
此行中的崩溃
pointer->complete[pointer->lastIndex] = strdup(string);
是因为pointer->complete
是NULL
。换句话说,您忘记为complete
分配内存。
我该如何解决这个问题?
您必须分配内存。看来你想要一个动态大小的char指针数组。因此,您需要使用realloc
,以便扩展已分配的内存并保留以前的值。
类似的东西:
char** tmp = realloc(pointer->complete, (pointer->lastIndex + 1) * sizeof(char*));
if (tmp == NULL)
{
// Out of memory
exit(1);
}
pointer->complete = tmp;
// Then you can do your normal code
pointer->complete[pointer->lastIndex] = strdup(string);
注意:虽然每次插入字符串都可以使用realloc
,但它可能会表现得相当糟糕。
因此,不是为每个新字符串重新分配内存,而是每次调用realloc
时重新分配一块内存可能更好。像:
if (pointer->lastIndex == pointer->size)
{
// Need more memory
// - if it's the first time just start with 10 (or another number)
// - else double the size
pointer->size = (pointer->size != 0) ? 2 * pointer->size : 10;
char** tmp = realloc(pointer->complete, (pointer->size) * sizeof(char*));
if (tmp == NULL)
{
// Out of memory
exit(1);
}
pointer->complete = tmp;
}
这里我决定在执行realloc
时将分配的内存加倍。您可以使用您喜欢的蚂蚁方法,例如总是增加10个而不是加倍。
BTW:名称lastIndex
似乎很差,因为它实际上是nextIndex
变量。
关于数据结构的最后一句话
您的数据结构,即struct table
对我来说似乎有点奇怪。在基础级别,您只能使用table
。在下一级别,您不使用table
,而只使用其他变量。
在我看来,你应该将结构分成两个结构,如:
struct StringTable {
char **complete;
int lastIndex;
int size;
};
struct table {
struct StringTable strings[26];
};
这样可以节省内存和一些动态内存分配。
答案 1 :(得分:-1)
你假设
const char * string
只包含小写字母。词典也有撇号 添加那个案例。