You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode两数之和C语言暴力解法指针相关问题求助

LeetCode两数之和C语言暴力解法常见问题解答

问题1:为什么调用twoSum必须传&returnSize,不能用错误写法?

错误写法的核心问题拆解

  • 语法错误根源:你写的twoSum(a, sizeof(a)/sizeof(a[0]), target, int*returnSize)完全不符合C语言语法——函数调用时,参数只需要传变量/常量/表达式,不能在参数里加类型声明(int*是类型,不能写在这里),所以编译器直接报expected expression before 'int'这类错误。
  • 值传递的本质:C语言函数参数是值传递,如果直接传returnSize(int类型变量),函数里拿到的只是它的一个副本,修改副本不会影响main里的原变量。而题目要求twoSum要通过returnSize告诉调用者返回数组的长度,所以必须传变量的地址(&returnSize),这样函数里通过解引用*returnSize才能直接修改main里的原变量。
  • 直接赋值的类型警告:如果你把函数里的*returnSize = 2;改成returnSize = 2;,这里的returnSize是函数的形参,类型是int*(指针),你给指针变量赋值一个int类型的2,属于“整数转指针”的非法类型转换,编译器会抛出incompatible integer to pointer conversion的警告,而且这时候你修改的是指针本身,完全没碰main里的原变量,returnSize的值根本不会被正确设置。

问题2:为什么twoSum返回类型要设为int*?移除后为什么报错?

本质逻辑说明

  • 返回类型和接收变量的匹配:main里的p是int*类型,用来接收twoSum返回的结果数组的首地址。twoSum返回int*是完全匹配的——它返回的是一段int类型数组的起始指针,不是什么“指针指向指针”,你混淆了概念:int*就是指向int的指针,用来表示int数组的首地址,和int**(指针指向指针)完全是两回事。
  • 为什么代码能运行:twoSum内部一般是用malloc动态分配了一个int数组(比如int* res = malloc(2*sizeof(int));),然后返回这个数组的首地址,main里的p接收这个地址后,就能通过p[0]、p[1]访问数组元素,这是C语言里动态数组的标准用法,完全合法。
  • 移除返回类型后的警告原因:C语言里,如果函数没有声明返回类型,编译器会默认把它当成返回int类型。这时候你用int*类型的p去接收int类型的返回值,就会出现pointer from integer without a cast的警告——把整数转成指针是危险操作,64位系统里指针是8字节,int是4字节,地址会被截断,导致p拿到的是错误的地址,程序运行时可能崩溃。另外,编译器还会提示implicit declaration of function 'twoSum'(隐式函数声明)的警告,因为没有提前声明返回类型,编译器无法做类型检查。

内容的提问来源于stack exchange,提问作者zappi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:55:40