我正在编写一个简单的c程序,该程序将文本文件中的行读取为char **。在我的主函数中,我创建char *数组,为其分配内存,然后将指向该数组的指针传递给另一个函数,以用char *代表该文本文件中每一行的内容填充该数组中的每个索引。 / p>
由于某种原因,我猜测与内存管理有关,我在while循环的第三次迭代中收到分段错误,该错误将字符串复制到字符串数组中。为什么会这样?
我的代码:
import pandas as pd
import sys
class CaptureErrors:
def __init__(self, stderr, output_name):
self.stderr = stderr
self.output_name = output_name
self.output_file = None
def __enter__(self):
self.output_file = open(self.output_name, "w")
return self
def __exit__(self, exc_type, exc_value, traceback):
if self.output_file:
self.output_file.close()
sys.stderr = self.stderr
def write(self, message):
self.stderr.write(message)
self.output_file.write(message)
def main():
filename = "test_data3.csv"
with CaptureErrors(sys.stderr, 'error.txt') as sys.stderr:
data = pd.read_csv(filename, error_bad_lines=False)
print(data.head())
if __name__=="__main__":
main()
预期结果:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void getRestaurants(char ***restaurantsArray) {
FILE *restaurantsFile = fopen("./restaurants.txt", "r");
char *restaurant = (char *)malloc(50 * sizeof(char));
char *restaurantCopy = restaurant;
//fopen will return null if it is unable to read the file
if (restaurantsFile == NULL) {
free(restaurant);
return;
}
int index = 0;
while (fgets(restaurantCopy, 50, restaurantsFile)) {
// segfault occurs the third time the following line is executed
*restaurantsArray[index] = (char*)malloc(50 * sizeof(char));
strcpy(*restaurantsArray[index], restaurantCopy);
printf("%s", restaurantCopy);
printf("%s", *restaurantsArray[index]);
index++;
}
fclose(restaurantsFile);
free(restaurant);
}
void main() {
char **restaurantsArray = (char **)malloc(100 * sizeof(char *));
char **restaurantsArrayCopy = restaurantsArray;
getRestaurants(&restaurantsArrayCopy);
}
,依此类推,如果提供的restaurant.txt文件包含:
firstline
firstline
secondline
secondline
thirdline
thirdline
答案 0 :(得分:2)
在getRestaurants
中,restaurantsArray
被声明为char ***Array
。在*restaurantsArray[index] = …;
行中,它使用restaurantsArray[index]
并尝试将其用作指针(通过应用*
运算符)。但是restaurantsArray
只是指向restaurantsArrayCopy
中main
的指针。 restaurantsArrayCopy
仅仅是一个对象,而不是数组。它只是一个char **
。在getRestaurants
中,对restaurantsArray[index]
使用index
除零以外的任何东西都会使用一些未定义的东西。
没有必要将&restaurantsArrayCopy
从main
传递到getRestaurants
。只需传递restaurantsArray
。这是指向已分配空间的指针。
然后,在getRestaurants
中使用*restaurantsArray[index] = …;
,而不使用restaurantsArray[index] = …;
,而不是*
。这将为restaurantsArray
中的元素分配一个值,这就是您要执行的操作。同样,删除*
和strcpy
中的printf
。