我在网上评判网站做了激励---- leetcode.And在这个问题上,我找不到问题出在哪里。 在Python中,即使列表超出界限,oj也会被接受。 但是在C中,即使数组没有超出范围,oj也会显示运行时错误。 为什么呢?
问题描述:
给定一个n
整数数组n > 1
,nums,返回一个数组输出,使output[i]
等于除nums[i]
之外的所有nums元素的乘积。
在没有除法的情况下解决它并在O(n)中解决。
例如,给定[1,2,3,4]
,返回[24,12,8,6]
。
跟进:
你能用恒定的空间复杂度解决它吗? (注意:出于空间复杂性分析的目的,输出数组不算作额外空间。)
mycode的:
的Python:
class Solution(object):
def productExceptSelf(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
size = len(nums)
output = [1] * size
left = 1
for x in range(size - 1):
left *= nums[x]
output[x + 1] *= left
right = 1
for x in range(size - 1, 0, -1):
right *= nums[x]
output[x - 1] *= right
return output
C:
//Return an array of size *returnSize.
//Note: The returned array must be malloced, assume caller calls free().
int *productExceptSelf(int* nums, int numsSize, int* returnSize) {
int left = 1, right = 1;
int i;
int resize[numsSize + 1];
for (i = 0 ; i < (numsSize + 1) ; i++)
resize[i] = 1;
for (i = 0 ; i < numsSize ; i++)
{
left *= nums[i];
resize[i + 1] *= left;
}
for (i = numsSize ; i > 0 ; i--)
{
right *= nums[i];
resize[i - 1] *= right;
}
returnSize = resize;
return returnSize;
}
答案 0 :(得分:1)
您在堆栈上分配一个数组,然后从该函数返回。这会立即释放在productExceptSelf
的堆栈上分配的所有变量,从而使该空间可以被另一个函数声明。您在返回时不会复制数组,您只返回其地址。此地址的Usago尝试在释放时访问该数组是导致错误的原因。正如评论在您的代码中所建议的那样,使用malloc
分配数组,而不是在堆栈中声明它。即做int* someArray = malloc( n * sizeof(int));
话虽如此,你的指针管理存在很多问题。我不确定你是否理解他们的工作方式。您的函数旨在返回两个值,即产品本身的数组及其最终大小。由于C
只能直接返回一个值,因此实际上直接返回类型为int*
的数组,并通过在给定的地址处写int
来返回类型int
的大小按resultSize
。即你应该做*resultSize = myActualSize
。对于数组,您可以执行return someArray
,即使用malloc
在堆上分配该数组,如上所述。