开发者

C programming language, array, pointer

开发者 https://www.devze.com 2023-01-18 05:56 出处:网络
int main() { int j=97; char arr[4]=\"Abc\"; printf(arr,j); getch(); return 0; } this code gives me a stack overflow error why?
int main()
{
    int j=97;
    char arr[4]="Abc";
    printf(arr,j);
    getch();
    return 0;
}

this code gives me a stack overflow error why? But if instead of printf(arr,j) we use printf(arr) then it prints Abc. please tell me how printf works , means 1st argument is const char* type so how arr is treated by compiler. sorry! above code is right it doesn't give any error,I write this by mistake. but below code give stack overflow error.

#include <stdio.h>
int main()
    {
       int i, a[i];
       getch();
       return 0;
    }

since variable i take any garbage value so that will be the size of the array so why this code give this error when i use DEV C++ and if I use TURBO C++ 3.0 th开发者_如何学Pythonen error:constant expression required displayed. if size of array can't be variable then when we take size of array through user input.no error is displayed. but why in this case.


please tell me how printf works

First of all, pass only non-user supplied or validated strings to the first argument of printf()!

printf() accepts a variable number of arguments after the required const char* argument (because printf() is what's called a variadic function). The first const char* argument is where you pass a format string so that printf() knows how to display the rest of your arguments.

If the arr character array contains user-inputted values, then it may cause a segfault if the string happens to contain those formatting placeholders, so the format string should always be a hard-coded constant (or validated) string. Your code sample is simple enough to see that it's really a constant, but it's still good practice to get used to printf("%s", arr) to display strings instead of passing them directly to the first argument (unless you absolutely have to of course).

That being said, you use the formatting placeholders (those that start with %) to format the output. If you want to display:

Abc 97

Then your call to printf() should be:

printf("%s %d", arr, j);

The %s tells printf() that the second argument should be interpreted as a pointer to a null-terminated string. The %d tells printf() that the third argument should be interpreted as a signed decimal.

this code gives me a stack overflow error why?

See AndreyT's answer.


I see that now the OP changed the description of the behavior to something totally different, so my explanation no longer applies to his code. Nevertheless, the points I made about variadic functions still stand.

This code results in stack invalidation (or something similar) because you failed to declare function printf. printf is a so called variadic function, it takes variable number of arguments. In C language it has [almost] always been mandatory to declare variadic functions before calling them. The practical reason for this requirement is that variadic functions might (and often will) require some special approach for argument passing. It is often called a calling convention. If you forget to declare a variadic function before calling it, a pre-C99 compiler will assume that it is an ordinary non-variadic function and call it as an ordinary function. I.e. it will use a wrong calling convention, which in turn will lead to stack invalidation. This all depends on the implementation: some might even appear to "work" fine, some will crash. But in any case you absolutely have to declare variadic functions before calling them.

In this case you should include <stdio.h> before calling printf. Header file <stdio.h> is a standard header that contains the declaration of printf. You forgot to do it; hence the error (most likely). There's no way to be 100% sure, since it depends on the implementation.

Otherwise, your code is valid. The code is weird, since you are passing j to printf without supplying a format specifier for it, but it is not an error - printf simply ignores extra variadic arguments. Your code should print Abc in any case. Add #include <stdio.h> at the beginning of your code, and it should work fine, assuming it does what you wanted it to do.

Again, this code

#include <stdio.h>

int main()
{
    int j=97;
    char arr[4]="Abc";
    printf(arr,j);
    return 0;
}

is a strange, but perfectly valid C program with a perfectly defined output (adding \n at the end of the output would be a good idea though).


In your line int i, a[i]; in the corrected sample of broken code, a is a variable-length array of i elements, but i is uninitialized. Thus your program has undefined behavior.


You see strings in C language are treated as char* and printf function can print a string directly. For printing strings using this function you should use such code:

printf("%s", arr);

%s tells the function that the first variable will be char*.

If you want to print both arr and j you should define the format first:

printf("%s%d", arr, j);

%d tells the function that the second variable will be int


I suspect the printf() issue is a red herring, since with a null-terminated "Abc" will ignore other arguments.

Have you debugged your program? If not can you be sure the fault isn't in getch()?
I cannot duplicate your issue but then I commented out the getch() for simplicity.

BTW, why did you not use fgetc() or getchar()? Are you intending to use curses in a larger program?

===== Added after your edit =====

Okay, not a red herring, just a mistake by the OP.

C++ does allow allocating an array with the size specified by a variable; you've essentially done this with random (garbage) size and overflowed the stack, as you deduced. When you compile with C++ you are typically no longer compiling C and the rules change (depending on the particular compiler).

That said, I don't understand your question - you need to be a lot more clear with "when we take size of array through user input" ...

0

精彩评论

暂无评论...
验证码 换一张
取 消