我正在尝试在C中malloc一个二维数组,其中每个条目都是一个字符串(所以,我认为是一个三维数组)。我读了很多书,这就是我的尝试。然而,我遇到了一个分段错误,我真的不确定哪里出了问题。我是编程新手,所以如果我的风格不好,我很抱歉!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
double temp, int_check;
int gen, exit_flag=0, valid_input, valid, i, j;
char ***S;
printf("argc %d\n", argc);
if(argc < 2)
{
printf("Please enter command line arguments of the form: a R where a is the number of generators and R are relators\n");
exit_flag = 1;
}
else
{
valid = sscanf(argv[1], "%lg", &temp);
int_check = temp - (int)temp;
valid_input = ((valid != 0) && (valid != EOF)) && (int_check == 0) && (temp > 0);
if(!valid_input)
{
printf("Invalid input, the number of generators must be an integer > 0\n");
exit_flag = 1;
}
gen = (int)temp;
printf("Number of generators = %d\n", gen);
}
if(exit_flag==0)
{
S = (char***)malloc(2*sizeof(char**)); /*Defintes the grid to the size required*/
if(S == NULL)
{
printf("Cannot allocate memory for the S");
}
for(i=0; i<2; i++)
{
S[i] = (char**)malloc((argc-2)*sizeof(char*));
if(S[i] == NULL)
{
printf("Cannot allocate memory for the S");
}
} /*Grid finished being given the right size*/
for(i=2; i<argc; i++) /*Put the relators in the grid. Make rhs equal 1*/
{
strcpy(S[0][i-2], argv[i]);
strcpy(S[1][i-2], "1");
printf("relator %s\n", S[0][i-2]);
}
printf("The array S is\n");
for(j=0; j<(argc-2); j++)
{
for(i=0; i<2; i++)
{
printf(" %s ", S[i][j]);
}
printf("\n");
}
}
else /*If the inputs are invalid, exit the program*/
{
exit(EXIT_FAILURE);
}
for(i=0; i<2; i++)
{
free(S[i]);
}
free(S);
return 0;
}发布于 2012-01-23 06:03:28
您永远不会为实际的字符分配任何内存,只为指向那些所需字符的各种指针分配内存。在此处添加分配:
for(i=2; i<argc; i++) /* Put the relators in the grid. Make rhs equal 1*/
{
S[0][i-2] = malloc(strlen(argv[i]) + 1); // allocate memory for the data
strcpy(S[0][i-2], argv[i]);
strcpy(S[1][i-2], "1");
printf("relator %s\n", S[0][i-2]);
}别忘了最后把整个乱七八糟的东西都解决掉。
我不确定重复的strcpy是否能满足您的需要;strcpy添加了一个空终止符,因此您的字符串将在此处结束。也许对于您的情况,strncpy是一个更有用的函数。
发布于 2012-01-23 06:04:26
您的问题出在像strcpy(S[0][i-2], argv[i]);这样的行中。你没有给这个字符串分配空间,它是垃圾指针。请改用S[0][i-2]=strdup(argv[i])。
发布于 2012-01-23 06:05:50
这段代码中有很多内存错误。有时你没有恶意锁定就释放了,有时你复制字符串而不检查它们的大小(所以字符串对于目的地来说可能太大了),而且你从来没有真正为字符串分配内存。
https://stackoverflow.com/questions/8965095
复制相似问题