【发布时间】:2020-05-16 13:49:57
【问题描述】:
下面是一个取自 leetcode 的问题:Two Sum 问题,其中一个特定的目标值应该从数组中任意 2 个元素的和得到,并且两个元素的索引应该是存储在返回数组中,应该分配并返回。
'ret is redeclared as different kind of symbol' 出现错误。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int *twoSum(int *nums, int numsSize, int target, int *ret) {
int i, j;
int *ret = (int *)malloc(sizeof(int) * 2);
for (i = 0; i < numsSize; i++) {
for (j = i + 1; j < numsSize; j++) {
if (nums[i] + nums[j] == target) {
ret[0] = i;
ret[1] = j;
}
}
}
return ret;
}
【问题讨论】:
-
您有 参数
ret,然后您还定义了 局部变量ret。删除其中一个。 -
关于:
int* ret=(int*)malloc(sizeof(int)*2);1) 一定要声明:#include <stdlib.h>2) 返回的类型是void*,可以分配给任何指针。强制转换只会使代码混乱并且容易出错。建议删除该演员表。 3) 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功 (==NULL) 则调用perror( "Your error message" );将您的错误消息和系统认为发生错误的文本原因输出到stderr。 -
关于语句:
for(i=0;i<numsSize;i++)建议将此for()循环限制为:for( i=0; i< (numsSize-1); i++ ),以避免变量j等于numsSize进行一次内部循环迭代。j的此类值导致nums[j]访问数组末尾之外的nums[]导致未定义的行为(并且可能是段错误事件) -
OT:关于:
int i,j;这是将这些变量的“范围”设置为file scope。但是,良好的编程习惯是限制变量的“范围”。建议删除该行并修改:for(i=0;i<numsSize;i++)至for( int i=0; i<numsSize; i++ )。类似的考虑适用于声明:for(j=i+1;j<numsSize;j++)。此外,请注意使用适当的水平间距以提高可读性。编译器并不关心,但人类确实关心可读性。 -
@BShan:点击分数下方的灰色复选标记,您可以接受其中一个答案。