在Struct中访问数组时程序崩溃

时间:2017-04-23 04:53:14

标签: c arrays string pointers struct

我尝试实现自动完成功能的第一部分,该功能接受字符串,计算特定字母的索引,然后在该索引处分配另一个结构指针。它还存储字符串数组中可能的单词完成。出于某种原因,当我尝试访问字符串数组字段时程序崩溃,我无法弄清楚原因。我该如何解决这个问题?

由于

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()

2 个答案:

答案 0 :(得分:2)

此行中的崩溃

pointer->complete[pointer->lastIndex] = strdup(string);

是因为pointer->completeNULL。换句话说,您忘记为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

只包含小写字母。词典也有撇号 添加那个案例。