指针算术分段问题

时间:2016-04-25 15:39:02

标签: c pointers segmentation-fault pointer-arithmetic

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 int string_cmp(const void *p, const void *q);

 int main(int argc, char **argv)
 {
    int i;   // variable
    char **words_array = malloc(sizeof(char*)*(argc+1)); // sets new array to hold the words
    char *p; // another char pointer array
    p = *words_array;       // set both equal to eachother

    for(; *p < (argc - 1); p++) // for loop
    {
            p = malloc(strlen(*argv) + 1); // determines size based on user input
            argv++; // increments
            strcpy(p++, *argv); // copies words to the new array

    }
    p = NULL; // resets p

    qsort(words_array, argc-1, sizeof(char *), string_cmp); // sorts the array
    for(i = 0; i < argc - 1; i++){ // for loop to print properly
            printf("%s ", words_array[i]);
    }
    printf("\n");
    return 0;
  }

 int string_cmp (const void *p, const void *q) // compares the two different          strings and returns a value
{
    const char *value = *(const char**)p;
    const char *value_two = *(const char**)q;

    return strcmp(value, value_two);
}

所以我的程序应该接受命令行参数并使用Qsort返回它们。例如“./a.out你好黑暗我的老朋友应该作为黑暗的朋友回复我的老朋友。我没有得到任何编译器错误,但我得到一个分段错误,我不知道如何解决这个问题我的指针算术。

3 个答案:

答案 0 :(得分:-1)

你正在递增双指针(argv),即

for(; *p < (argc - 1); p++) // for loop
{
        p = malloc(strlen(*argv) + 1); // determines size based on user input
        argv++; // increments
        strcpy(p++, *argv); // copies words to the new array

}

所以将其改为(* argv)++

答案 1 :(得分:-1)

这些是有点建议:

char** argv更改为char* argv[]

argc返回的值超过传递的实际参数数量。额外计数用于可执行文件名称。

所以做一些错误检查是好的,请执行:

argc--;
if(argc > 0) // We have some arguments
{
/* Do something 
 * char **words_array = malloc(sizeof(char*)*(argc+1)
 * may be changed to 
 */
  char **words_array;
  words_array=malloc(argc*sizeof(char*));
/* Coming down 
 * You could change that for-loop to something like this.
 */
 for(int i=0;i<argc;i++)
     words_array[i]=argv[i]; //  You have all the arguments stored in words_array
/* Now go on sort words_array
 * and so and so forth
 */    

}

答案 2 :(得分:-1)

问题在于你的for循环。您将*pargc进行比较,这是毫无意义的。用标准计数器i替换循环。

for (i = 1; i < argc; i++)

请注意,应该使用argc - 1来代替argc,并且循环应该从1开始而不是从0开始。 此外,在循环中,您可以使用argv[i]代替*argv