数组数组的运行时数组分配
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_start
和 idx_end
初始化堆栈上的自动变量,然后分配给 arr[]
中的当前索引。但是这个值在堆栈上是短暂的。它在最坏的情况下不会超过范围,最好的情况下会在下一次迭代中重新使用。如果我了解您的用例,我建议声明 int arr[26][2]
,它为 arr
中的 26 个索引中的每一个分配两个整数。然后你会设置 arr[arr_index][1] = idx_start
和 arr[arr_index][2] = idx_end
。 (实际上,如果是我,我会定义一个 struct interval { int start; int end };
然后制作一个数组,struct interval arr[26]
和 arr[arr_index].start=idx_start
和 arr[arr_index].end=idx_end
但这可能比你在哪里。)也正如有人指出的那样,arr
在函数 returns 时消失。不确定您打算如何访问它。
我显然对内存分配和数组有一个悲惨的把握。我想要的很简单,有一个数组数组,数组中包含一个区间。我的问题是即使我在 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_start
和 idx_end
初始化堆栈上的自动变量,然后分配给 arr[]
中的当前索引。但是这个值在堆栈上是短暂的。它在最坏的情况下不会超过范围,最好的情况下会在下一次迭代中重新使用。如果我了解您的用例,我建议声明 int arr[26][2]
,它为 arr
中的 26 个索引中的每一个分配两个整数。然后你会设置 arr[arr_index][1] = idx_start
和 arr[arr_index][2] = idx_end
。 (实际上,如果是我,我会定义一个 struct interval { int start; int end };
然后制作一个数组,struct interval arr[26]
和 arr[arr_index].start=idx_start
和 arr[arr_index].end=idx_end
但这可能比你在哪里。)也正如有人指出的那样,arr
在函数 returns 时消失。不确定您打算如何访问它。