数组数组的运行时数组分配

runtime array assignment for an array of arrays

我显然对内存分配和数组有一个悲惨的把握。我想要的很简单,有一个数组数组,数组中包含一个区间。我的问题是即使我在 int arr_letter[2] 下分配了一个新数组并将其分配给 arr[arr_index],在每次迭代中,所有值:arr[0]、arr[1]、arr[2] ....,分配​​给 arr[arr_index].

中的内容

我想因为我声明 int * arr[26] 的方式,每次我想向这个数组添加一个新元素时,我都需要一个区间 [x,y] 的类似数组,而不是做我正在做的事情,就是覆盖数组。但我想知道是否有人有更好的方法?

int * partitionLabels(char * S, int * returnSize)
{

    int * arr[26];
    memset(arr, 0, 26*sizeof(arr[0]));
    
    int idx_start = 0;
    int idx_end = 0;

    int i = 0;
    int j = 0;
    while(S[i] != '[=10=]')
    {
        // this populates all the intervals
    //  printf("%c %d\n ", S[i], S[i]-97);
        int arr_index = S[i]-97;
        if(arr[arr_index] == 0)
        {
            // S[i]-97 is the integer representation of the character

            idx_start = i;
            idx_end = i;
            j = i;
            while(S[j] != '[=10=]')
            {
                if(S[j] == S[i]) idx_end = j;       
                j++;
            }
            int arr_letter[2] = {idx_start, idx_end}; // problem is HERE
            arr[arr_index] = arr_letter;
        }
        i++;
    }

    int main()
    {
        char * s = "ababcbacadefegdehijhklij";
    
        int returnSize = 0;
    
        partitionLabels(s, &returnSize);
    }

问题是您没有使用内存分配。 :-) 您的 arr 数组是一个指向整数的指针数组,但是没有地方可以存储声明的整数。当您执行 int arr_letter[2] = {idx_start, idx_end} 时,您正在使用值 idx_startidx_end 初始化堆栈上的自动变量,然后分配给 arr[] 中的当前索引。但是这个值在堆栈上是短暂的。它在最坏的情况下不会超过范围,最好的情况下会在下一次迭代中重新使用。如果我了解您的用例,我建议声明 int arr[26][2],它为 arr 中的 26 个索引中的每一个分配两个整数。然后你会设置 arr[arr_index][1] = idx_startarr[arr_index][2] = idx_end。 (实际上,如果是我,我会定义一个 struct interval { int start; int end }; 然后制作一个数组,struct interval arr[26]arr[arr_index].start=idx_startarr[arr_index].end=idx_end 但这可能比你在哪里。)也正如有人指出的那样,arr 在函数 returns 时消失。不确定您打算如何访问它。