【发布时间】:2020-08-08 13:38:34
【问题描述】:
我有一个代码 sn-p https://leetcode.com/problems/letter-combinations-of-a-phone-number/discuss/397542/C-solution
我是在网上提交的,测试通过了。然而,当我想在本地机器上进行测试时,我遇到了一个问题“程序以信号 SIGSEGV 终止,分段错误。”当它到达下一行断点 - return result。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void catRes(char **result, char **phone, char *digits, char *tmp, int nowIndex,
int *resLen) {
if (nowIndex == strlen(digits)) {
tmp[nowIndex] = 0;
result[(*resLen)] = (char *)malloc(strlen(tmp) + 1);
strcpy(result[(*resLen)], tmp);
(*resLen)++;
return;
}
char *phoneData = phone[digits[nowIndex] - '0' - 2];
for (int i = 0; i < strlen(phoneData); i++) {
tmp[nowIndex] = phoneData[i];
catRes(result, phone, digits, tmp, nowIndex + 1, resLen);
}
}
char ** letterCombinations(char * digits, int* returnSize){
char *phone[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
char **result = (char **)malloc(sizeof(char *) * 40);
char tmp[strlen(digits) + 1];
int resLen = 0;
if (strlen(digits) == 0) {
*returnSize = resLen;
return result;
}
catRes(result, phone, digits, tmp, 0, &resLen);
*returnSize = resLen;// set breakpoint here
return result;
}
int main(){
char s[] = {'2', '3'};
char * digits = s;
int * returnSize = NULL;
char ** outcome = letterCombinations(digits, returnSize);
...
return 0;
我在return result 之前的那行检查了result 的值,看起来还可以。我需要一些帮助来告诉我问题出在哪里。
【问题讨论】:
-
*returnSize = resLen;取消引用空指针并调用 未定义的行为 -
strlen(digits)-digits不是以 null 结尾的字节字符串,因此这也会调用 UB -
尝试通过Valgrind运行它
-
@cajomar 是的,它显示了一个非初始化值的访问的 lonnnng 列表,然后最终写入 0