我有一个字符指针,用于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
答案 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
也返回的内存地址。