我确信我只是忽略了一些简单的东西,但我还没能弄清楚。我的代码是
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h> // For exit()
#include <unistd.h> // for getopt()
const int MAX_PID_LENGTH = 10; // #(PID allowed for user to input)
int main(int argc, char * argv[]) {
int opt; // i.e. option to be parsed
int pidCount = 0; // i.e. #(counted PID)
char ** pidArray;
int pidArrayLength = 10;
while ((opt = getopt(argc, argv, "p:")) != -1) {
switch (opt) {
case 'p':
if (!optarg) {
printf("Invalid command line arguments.n");
exit(EXIT_FAILURE);
}
if (!pidArray) {
pidArray = (char ** ) malloc(sizeof(char * ) * pidArrayLength);
if (!pidArray) {
printf("Unable to allocate memory.n");
exit(EXIT_FAILURE);
}
} else if (pidCount >= pidArrayLength) {
pidArrayLength *= 2;
pidArray = (char ** ) realloc(pidArray, sizeof(char * ) * pidArrayLength);
if (!pidArray) {
printf("Unable to reallocate memory./n");
exit(EXIT_FAILURE);
}
}
pidArray[pidCount] = (char * ) malloc(sizeof(char) * MAX_PID_LENGTH);
strcpy(pidArray[pidCount], optarg);
pidCount++;
}
}
}
当我用命令行参数"运行此代码时-p1";(或任何其它代替"1"的东西(,我在"1"行得到分段故障;pidArray[pidCount]=(char*(malloc(sizeof(char(*MAX_PID_LENGTH(&";。值得注意的是,如果我将此行中的pidCount更改为0,则不会得到Segmentation Fault,即使pidCount的值为0。此外,当我ssh到学校的一台计算机并在那里运行代码时,我不会收到任何这样的错误。
如果能深入了解是什么导致了这个错误以及如何修复它,我们将不胜感激!
- 访问
if
语句中未初始化的变量pidArray
。您需要在初始化中初始化ot NULL或malloc it - 您不需要强制转换malloc的结果
- 而是使用sizeof中的对象而不是类型:
pidArray = malloc(sizeof(*pidarray) * pidArrayLength);
sizeof(char)
根据定义是1
,完全不需要