以下のコードで、strncpyのコンパイルと実行の両方を削除すると、セグメンテーション違反は発生しません。しかし、strcpyを使用すると、セグメンテーション違反が発生します。どちらの場合も、読み取り専用アドレスを正しく変更しようとしていますか?それでは、なぜ予期しない動作が発生するのでしょうか。
#include<stdio.h>
#include<string.h>
int main()
{
unsigned char* newPrompt="# ";
static unsigned char* au1CLIPromptStrings [] =
{
"",
"Login: ",
"Password: ",
"0123456789012345678901234",
"0123456789012345678901234",
};
/* here am trying to moodify the read only address */
au1CLIPromptStrings[3] = "# \0";
au1CLIPromptStrings[4] = "# \0";
/* removed two strncpy second time */
printf("a1 = %s and a2 = %s\n",au1CLIPromptStrings[3],au1CLIPromptStrings[4]);
/* here using strcpy am trying to modify */
strncpy(au1CLIPromptStrings[3],newPrompt,strlen(au1CLIPromptStrings[3])) ;
strncpy(au1CLIPromptStrings[4],newPrompt,strlen(au1CLIPromptStrings[4])) ;
}
前もって感謝します..
私が今直面している問題が1つあります。au1CLIPromptStringsの値を、多くの場所で使用されているbiengである別のダブルポインターに渡す必要があります。したがって、構造要素elemetにあるunsigned char型のダブルポインターにau1CLIPromptStringsのアドレスを割り当てると、要素は、アドレスが適切になっている場合でもNULLを取得します。どこでも同じau1CLIPromptStrings varibaleを使用することはできません。これは、私が言った、
unsigned char **newPrompt1 =NULL;
newPrompt1 = au1CLIPromptStrings;
printf("a1 = %s and a2 = %s\n", newPrompt1[3],newPrompt1[4]);
#include<stdio.h>
#include<string.h>
int main()
{
unsigned char *newPrompt="# ";
unsigned char **newPrompt1 =NULL;
unsigned char au1CLIPromptStrings [7][30] =
{
"",
"Login: ",
"Password: ",
" 0123456789012345678901234",
" 0123456789012345678901234",
};
newPrompt1 = au1CLIPromptStrings; // here am assigning the address
printf("b1 = %u and b2 = %u\n",newPrompt1,au1CLIPromptStrings);
printf("a1 = %s and a2 = %s\n",newPrompt1[3],newPrompt1[4]);
}