增加指针位置

时间:2018-01-19 16:58:29

标签: c pointers increment

我有一个字符指针,用于CSV文件的部分文件名。我需要遵循以下模式:0,1,2,...,9,A,B,...,Y,Z,10,11 ......等永远。下面的代码是处理该代码的程序的一部分,但是当我尝试递增其中一个"数字时,我得到了一个分段错误。在字符指针with open('filename.txt','w') as f: for city, values in my_dict.items(): f.write(city + '\n') f.write("\n".join([" {}: {}".format(value_key, digit) for value_key, digit in values.items()]) + '\n') f.write('\n') 中。我很确定我现在拥有的内容会将指针递增到下一个地址(它不存在)。

我尝试了许多不起作用的事情(其中一半做了同样的事情而另一半没有编译)。它可能是其他失败的东西,但我相当确定它。我不得不使用C,所以我不能使用字符串。

FILE_num

1 个答案:

答案 0 :(得分:2)

您有内存泄漏和未定义的行为。

FILE_num = "0" ;

导致内存泄漏 - 丢失了动态分配的内存的地址。

“0”是一个包含字符'0'\0的数组。当你写这个语句时 - 该数组衰减成指向数组的第一个元素的指针然后你分配它。 FILE_num之前包含已分配内存的地址。现在你没有那个( 根据你给定的代码 - 如果你没有将地址存储在其他地方。)。所以你无法访问它。这就是内存泄漏的原因。

C中的字符串文字是不可变的。你试图改变它。这是未定义的行为。

再次,

FILE_num = (char *) malloc (sizeof (char)) ;

正在为1 char分配内存。您应该分配适当大小的内存。如果您要分配大小1,那么最好只使用char(这不是这种情况)。

digit = strlen (FILE_num);...

您首先访问\0 - 这是不需要的。您可以从strlen( FILE_NUM )-1转到0

并且malloc返回的void*也会隐式转换为char* - 您无需投射它。

所以正确的方法是

FILE_num = malloc (sizeof (char) * LENGTH) ;

您需要检查malloc的返回值,以便万一失败,您将处理这种情况。

if( NULL == FILE_num ){
    perror("malloc failed");
    exit(EXIT_FAILURE);
}

您跳过skip :;<=>?@的想法也不是那么清楚。您可能想要正确地重新检查逻辑。

FILE_num = malloc(..)
char *store_for_later_use = FILE_num;
...

现在您可以更改FILE_num

如果要使用与FILE_num具有相同内容的字符串初始化"0",请使用strdup(如果不存在(不是标准的一部分),您可以复制它("0")到动态分配的内存)。

FIL_num = strdup("0");

注意完成后使用动态分配的内存。 (您需要释放strdup也返回的内存地址。