【发布时间】:2014-09-11 01:03:44
【问题描述】:
我想在 C 中返回 char* 的一部分(或者说是子字符串)。关键是用户定义了我想要返回的起始索引和长度。首先,我检查给定的值是否在范围内并且是正数,如果不是,我想返回一个空值。
这是我尝试过的:
#include <stdio.h>
#include <stdlib.h>
char * f(char a[], int start, int len, int lenA)
{
int i, j = 1;
char *temp;
if ((start + len) > lenA)
return NULL;
if (start < 0 || len < 0)
return NULL;
else if (len == 0) {
temp = malloc(sizeof(char)*1);
return temp;
}
temp = malloc(sizeof(char)*len);
for (i = 0; len >= j; i++, j++) {
temp[i] = a[start];
start++;
}
return temp;
}
int main(void)
{
int i;
char *a = {'a', 'b', 'c'};
a = f(a, 0, 2, 3);
int size = sizeof(a) / sizeof(a[0]);
if (a != NULL) {
printf("{");
for (i = 0; i < size; i++) {
printf("'%c',", a[i]);
if (i < (size - 1))
printf(" ");
}
printf("}\n");
}
else printf("null\n");
return 0;
}
关键是当我运行它时,我收到一条错误消息:Segmentation fault (core dumped)
相反,它应该打印:{'a', 'b'}。正如您在我的 main 中看到的那样,我使用 0 开始索引和长度为 2 调用了该函数,因此它应该获取前两个字符。任何想法,如何解决它?
【问题讨论】:
-
您在哪一行得到错误?此外,
sizeof(a)返回指针的大小,而不是a指向的结构的大小。而且你不会释放 malloc 的内存。 -
@MrLister 它不显示任何行号,它可以编译,但是当我运行它时,我得到一个分段错误错误。
-
在这种情况下,将一些诊断输出添加到程序的关键位置。
puts("Now about to calculate the size");之类的东西,这样你就知道程序在崩溃之前走了多远。 -
你必须在调试器中运行你的程序。
-
反正
size的定义不好会出问题;在示例中它应该是 2,但它变成了 4(或 8,取决于您的设置)。所以你正在阅读超出分配的内存。